详解Spring Boot Oauth2缓存UserDetails到Ehcache

2025-05-29 0 86

在spring中有一个类cachinguserdetailsservice实现了userdetailsservice接口,该类使用静态代理模式为userdetailsservice提供缓存功能。该类源码如下:

cachinguserdetailsservice.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
<?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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37
@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;

}

}

使用

?

1

2
@autowired

private userdetailsservice userdetailsservice;

欢迎关注我的oauthserver项目,仅仅需要运行建表sql,修改数据库的连接配置,即可得到一个spring boot oauth2 server微服务。项目地址https://github.com/jeesun/oauthserver

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

原文链接:http://www.cnblogs.com/rainmer/p/9417108.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 详解Spring Boot Oauth2缓存UserDetails到Ehcache https://www.kuaiidc.com/111307.html

相关文章

发表评论
暂无评论