详解Spring Boot Oauth2缓存UserDetails到Ehcache

 更新时间:2018年08月08日 11:11:41   作者:五毛程序员  
这篇文章主要介绍了详解Spring Boot Oauth2缓存UserDetails到Ehcache,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

在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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决IDEA和CMD中java命令提示错误: 找不到或无法加载主类的问题

    解决IDEA和CMD中java命令提示错误: 找不到或无法加载主类的问题

    这篇文章主要介绍了解决IDEA和CMD中java命令提示错误: 找不到或无法加载主类的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • MyBatis如何通过xml方式实现SaveOrUpdate

    MyBatis如何通过xml方式实现SaveOrUpdate

    这篇文章主要讲如何通过xml方式实现SaveOrUpdate,但是仍然建议在Service中实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-06-06
  • MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用详解

    MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用详解

    这篇文章主要介绍了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Java图形化界面设计之布局管理器之BorderLayout案例详解

    Java图形化界面设计之布局管理器之BorderLayout案例详解

    这篇文章主要介绍了Java图形化界面设计之布局管理器之BorderLayout案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Springboot动态配置AOP切点详解

    Springboot动态配置AOP切点详解

    这篇文章主要介绍了Springboot动态配置AOP切点详解,Springboot 可以定义注解切点去拦截注解修饰的类方法以及execution(xxxx)切点去拦截具体的类方法,默认情况下我们都会使用注解@PointCut去定义切点,然后定义切面拦截切点,需要的朋友可以参考下
    2023-09-09
  • java string类方法深入解析

    java string类方法深入解析

    以下是对java中的string类方法进行了详细的分析介绍。需要的朋友可以过来参考下
    2013-08-08
  • Java Excel Poi字体颜色自定义设置代码

    Java Excel Poi字体颜色自定义设置代码

    最近项目使用POI按模板导出Excel,需要设置单元格的字体为红色,下面这篇文章主要给大家介绍了关于Java Excel Poi字体颜色自定义设置的相关资料,需要的朋友可以参考下
    2024-01-01
  • 使用Feign调用注解组件(实现字段赋值功能)

    使用Feign调用注解组件(实现字段赋值功能)

    这篇文章主要介绍了使用Feign调用注解组件(实现字段赋值功能),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring的循环依赖、三级缓存解决方案源码详细解析

    Spring的循环依赖、三级缓存解决方案源码详细解析

    这篇文章主要介绍了Spring的循环依赖、三级缓存解决方案源码详细解析,在Spring中,由于IOC的控制反转,创建对象不再是简单的new出来,而是交给Spring去创建,会经历一系列Bean的生命周期才创建出相应的对象,需要的朋友可以参考下
    2024-01-01
  • java substring(a)与substring(a,b)的使用说明

    java substring(a)与substring(a,b)的使用说明

    这篇文章主要介绍了java substring(a)与substring(a,b)的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论