shiro使用缓存

JAVA ginotang 1540℃ 0评论

shiro缓存机制

shiro中的缓存由CacheManager接口提供支持,shiro官方提供的shiro-ehcache库实现了该接口。也就是说,shiro的缓存机制依赖于ehcache库,因此,当项目中需要使用缓存的时候,需要另外导入shiro-ehcache库和ehcache核心库。

缓存的好处不用多说,它能够提高程序的执行效率,有效提供io的利用率。

shiro中可以使用缓存的地方有两个,分别是Realm缓存和Session缓存。默认情况下,缓存功能是关闭状态的。

Realm缓存

所有继承自CachingRealm的Realm类都可以被缓存,得益于它的CacheManager属性。一般,被缓存的信息都是验证和授权信息,从AuthenticatingRealm和AuthorizingRealm的源码可知,它们会先尝试到缓存中取出验证和授权信息,如果找到,则返回缓存中的信息,否则到保存这些信息的地方获取。

开启Realm缓存

以JdbcRealm为例子,在spring的applicationContext文件中开启缓存的方法如下:

缓存配置文件shiro-cache

name属性和applicationContext中配置的authenticationCacheName和authorizationCacheName匹配。

缓存成功开启之后,用户第一次通过subject.login方法登录之后,用户的验证信息和授权信息都会被保存起来,只要缓存未过期和未被清除,用户下次登录的时候提交的账号信息就会和缓存中的做比较,如果匹配就可以成功登录,即使数据库中的信息已经被更新过,所以,数据库信息更新之后最好手动清除缓存。

清除缓存的方法有两种:

第一种是直接调用CachingRealm的clearCacheXXX()方法,例如AuthenticatingRealm调用clearCachedAuthenticationInfo()清除验证缓存;AuthorizingRealm则调用clearCachedAuthorizationInfo()方法清除授权缓存。

第二种是调用subject.logout()方法,logout方法被执行的时候会同时清空账号信息缓存。subject.logout方法最终会调用CachingRealm的onLogout方法。下面是CachingRealm的onLogout()方法的源码:

logout clear cache

Session缓存

Session缓存和Realm缓存使用的可以是同一个CacheManger对象,也可以使用不同的对象,为了方便,这里使用了相同的CacheManager。

开启Session缓存

和Realm一样,session缓存的配置也是非常简单的,不同的是,session中的缓存是通过SessionDao操作CacheManager实现的。从DefaultSessionManager类中可以查到下面的代码:

session caching

applicationContext配置文件:

因为和上面的Realm使用的同一个CacheManager,这里不再重复配置。

缓存配置文件shiro-cache

完整applicationContext配置文件

如果Realm和SessionDao使用的是同一个CacheManager对象,可以直接把这个对象注入到SecurityManager中,而不再需要单独配置Realm和SessionDao的注入。

完整配置文件:

可能遇到的问题

可能会遇到下面的异常:

Another unnamed CacheManager already exists in the same VM

异常原因

Ehcache 2.5版本之后不再允许多个相同名字的CacheManager存在于jvm中,但是默认情况下CacheManager并不以单例的形式创建。需要指出的是,这个CacheManager并不是shiro提供的CacheManager接口,而是ehcache库下的一个具体类。

解决办法

使用CacheManager类的静态方法create()创建对象,create()方法会检查当前环境下是否已经存在CacheManager对象,如果存在则直接返回该对象,否则创建一个新的对象。

applicationContext文件相关配置:

 

转载请注明:Pure nonsense » shiro使用缓存

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x