在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能。该类源码如下:
CachingUserDetailsService.java
public class CachingUserDetailsService implements UserDetailsService {
private UserCache userCache = new NullUserCache();
private final UserDetailsService delegate;
CachingUserDetailsService(UserDetailsService delegate) {
this.delegate = delegate;
}
public UserCache getUserCache() {
return this.userCache;
}
public void setUserCache(UserCache userCache) {
this.userCache = userCache;
}
public UserDetails loadUserByUsername(String username) {
UserDetails user = this.userCache.getUserFromCache(username);
if (user == null) {
user = this.delegate.loadUserByUsername(username);
}
Assert.notNull(user, "UserDetailsService " + this.delegate + " returned null for username " + username + ". This is an interface contract violation");
this.userCache.putUserInCache(user);
return user;
}
}
CachingUserDetailsService默认的userCache属性值为new NullUserCache(),
该对象并未实现缓存。因为我打算使用EhCache来缓存UserDetails,所以需要使用Spring的EhCacheBasedUserCache类,该类是UserCache接口的实现类,主要是缓存操作。
缓存UserDetails到Ehcache的具体实现如下:
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir" />
<cache name="userCache"
maxElementsInMemory="0"
eternal="true"
overflowToDisk="true"
diskPersistent="true"
memoryStoreEvictionPolicy="LRU">
</cache>
</ehcache>
UserDetailsCacheConfig.java
@Slf4j
@Configuration
public class UserDetailsCacheConfig {
@Autowired
private CustomUserDetailsService customUserDetailsService;
@Bean
public UserCache userCache(){
try {
EhCacheBasedUserCache userCache = new EhCacheBasedUserCache();
val cacheManager = CacheManager.getInstance();
val cache = cacheManager.getCache("userCache");
userCache.setCache(cache);
return userCache;
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
return null;
}
@Bean
public UserDetailsService userDetailsService(){
Constructor<CachingUserDetailsService> ctor = null;
try {
ctor = CachingUserDetailsService.class.getDeclaredConstructor(UserDetailsService.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
Assert.notNull(ctor, "CachingUserDetailsService constructor is null");
ctor.setAccessible(true);
CachingUserDetailsService cachingUserDetailsService = BeanUtils.instantiateClass(ctor, customUserDetailsService);
cachingUserDetailsService.setUserCache(userCache());
return cachingUserDetailsService;
}
}
使用
@Autowired
private UserDetailsService userDetailsService;
欢迎关注我的oauthserver项目,仅仅需要运行建表sql,修改数据库的连接配置,即可得到一个Spring Boot Oauth2 Server微服务。项目地址https://github.com/jeesun/oauthserver
来源:http://www.cnblogs.com/rainmer/p/9417108.html
标签:Spring,Boot,Oauth2,缓存
0
投稿
猜你喜欢
Android自定义View实现绘制虚线的方法详解
2022-06-24 01:18:10
java实现图片转base64字符串 java实现base64字符串转图片
2023-07-19 10:42:44
一文带你搞懂Java中的泛型和通配符
2023-12-10 16:15:07
Spring使用三级缓存解决循环依赖的问题
2023-03-14 09:06:15
Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息
2021-07-17 00:52:51
Android带圆形数字进度的自定义进度条示例
2021-10-04 20:20:01
Java多文件以ZIP压缩包导出的实现方法
2023-10-08 14:05:20
Android实现登录注册功能封装
2023-03-20 08:46:46
C#反射应用实例
2023-11-03 14:47:46
Springcloud整合stream,rabbitmq实现消息驱动功能
2023-07-16 10:46:08
windows下java环境变量的设置方法
2022-12-01 03:13:14
如何解决springmvc文件下载,内容损坏的问题
2023-10-11 07:12:10
Java虚拟机内存结构及编码实战分享
2023-11-29 13:47:47
详解C#如何加密解密RAR文件
2023-09-19 16:25:10
spring启动加载程序的几种方法介绍
2022-03-11 14:15:32
Android中post请求传递json数据给服务端的实例
2022-04-21 01:51:18
浅谈java安全编码指南之死锁dead lock
2023-06-22 04:49:19
C#使用Socket实现本地多人聊天室
2022-01-06 12:47:27
Flutter输入框TextField属性及监听事件介绍
2023-07-09 10:28:51
C# Razor语法规则
2021-07-27 23:53:43