好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解Spring Boot Oauth2缓存UserDetails到Ehcache

在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

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

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

查看更多关于详解Spring Boot Oauth2缓存UserDetails到Ehcache的详细内容...

  阅读:41次