详解Spring Boot Oauth2缓存UserDetails到Ehcache
程序员文章站
2024-02-23 22:34:10
在spring中有一个类cachinguserdetailsservice实现了userdetailsservice接口,该类使用静态代理模式为userdetailsser...
在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微服务。项目地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。