千家信息网

shiro缓存机的示例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下shiro缓存机的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Shiro提供了类似于Sprin
千家信息网最后更新 2026年11月03日shiro缓存机的示例分析

小编给大家分享一下shiro缓存机的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。

Shiro提供的Cache接口:

Java代码

public interface Cache {  //根据Key获取缓存中的值  public V get(K key) throws CacheException;  //往缓存中放入key-value,返回缓存中之前的值  public V put(K key, V value) throws CacheException;  //移除缓存中key对应的值,返回该值  public V remove(K key) throws CacheException;  //清空整个缓存  public void clear() throws CacheException;  //返回缓存大小  public int size();  //获取缓存中所有的key  public Set keys();  //获取缓存中所有的value  public Collection values(); }

Shiro提供的CacheManager接口:

Java代码

public interface CacheManager {  //根据缓存名字获取一个Cache  public  Cache getCache(String name) throws CacheException; }

Shiro还提供了CacheManagerAware用于注入CacheManager:

Java代码

public interface CacheManagerAware {  //注入CacheManager  void setCacheManager(CacheManager cacheManager); }

Shiro内部相应的组件(DefaultSecurityManager)会自动检测相应的对象(如Realm)是否实现了CacheManagerAware并自动注入相应的CacheManager。

Realm缓存

Shiro提供了CachingRealm,其实现了CacheManagerAware接口,提供了缓存的一些基础实现;另外AuthenticatingRealm及AuthorizingRealm分别提供了对AuthenticationInfo 和AuthorizationInfo信息的缓存。

ini配置

Java代码

userRealm=com.github.zhangkaitao.shiro.chapter11.realm.UserRealm userRealm.credentialsMatcher=$credentialsMatcher userRealm.cachingEnabled=true userRealm.authenticationCachingEnabled=true userRealm.authenticationCacheName=authenticationCacheuserRealm.authorizationCachingEnabled=true userRealm.authorizationCacheName=authorizationCache securityManager.realms=$userRealm cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager cacheManager.cacheManagerConfigFile=classpath:shiro-ehcache.xml securityManager.cacheManager=$cacheManager

userRealm.cachingEnabled:启用缓存,默认false;
userRealm.authenticationCachingEnabled:启用身份验证缓存,即缓存AuthenticationInfo信息,默认false;
userRealm.authenticationCacheName:缓存AuthenticationInfo信息的缓存名称;
userRealm. authorizationCachingEnabled:启用授权缓存,即缓存AuthorizationInfo信息,默认false;
userRealm. authorizationCacheName:缓存AuthorizationInfo信息的缓存名称;

cacheManager:缓存管理器,此处使用EhCacheManager,即Ehcache实现,需要导入相应的Ehcache依赖,请参考pom.xml;

因为测试用例的关系,需要将Ehcache的CacheManager改为使用VM单例模式:

this.manager = new net.sf.ehcache.CacheManager(getCacheManagerConfigFileInputStream());

改为

this.manager = net.sf.ehcache.CacheManager.create(getCacheManagerConfigFileInputStream());

测试用例

Java代码

@Test public void testClearCachedAuthenticationInfo() {  login(u1.getUsername(), password);  userService.changePassword(u1.getId(), password + "1");   RealmSecurityManager securityManager =   (RealmSecurityManager) SecurityUtils.getSecurityManager();  UserRealm userRealm = (UserRealm) securityManager.getRealms().iterator().next();  userRealm.clearCachedAuthenticationInfo(subject().getPrincipals());  login(u1.getUsername(), password + "1"); }

首先登录成功(此时会缓存相应的AuthenticationInfo),然后修改密码;此时密码就变了;接着需要调用Realm的clearCachedAuthenticationInfo方法清空之前缓存的AuthenticationInfo;否则下次登录时还会获取到修改密码之前的那个AuthenticationInfo;

Java代码

@Test public void testClearCachedAuthorizationInfo() {  login(u1.getUsername(), password);  subject().checkRole(r1.getRole());  userService.correlationRoles(u1.getId(), r2.getId());   RealmSecurityManager securityManager =   (RealmSecurityManager) SecurityUtils.getSecurityManager();  UserRealm userRealm = (UserRealm)securityManager.getRealms().iterator().next();  userRealm.clearCachedAuthorizationInfo(subject().getPrincipals());  subject().checkRole(r2.getRole()); }

和之前的用例差不多;此处调用Realm的clearCachedAuthorizationInfo清空之前缓存的AuthorizationInfo;

另外还有clearCache,其同时调用clearCachedAuthenticationInfo和clearCachedAuthorizationInfo,清空AuthenticationInfo和AuthorizationInfo。

UserRealm还提供了clearAllCachedAuthorizationInfo、clearAllCachedAuthenticationInfo、clearAllCache,用于清空整个缓存。

在某些清空下这种方式可能不是最好的选择,可以考虑直接废弃Shiro的缓存,然后自己通过如AOP机制实现自己的缓存;可以参考:

https://github.com/zhangkaitao/es/tree/master/web/src/main/java/com/sishuok/es/extra/aop

另外如果和Spring集成时可以考虑直接使用Spring的Cache抽象,可以考虑使用SpringCacheManagerWrapper,其对Spring Cache进行了包装,转换为Shiro的CacheManager实现:

https://github.com/zhangkaitao/es/blob/master/web/src/main/java/org/apache/shiro/cache/spring/SpringCacheManagerWrapper.java

Session缓存

当我们设置了SecurityManager的CacheManager时,如:

Java代码

securityManager.cacheManager=$cacheManager

当我们设置SessionManager时:

Java代码

sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager securityManager.sessionManager=$sessionManager

如securityManager实现了SessionsSecurityManager,其会自动判断SessionManager是否实现了CacheManagerAware接口,如果实现了会把CacheManager设置给它。然后sessionManager会判断相应的sessionDAO(如继承自CachingSessionDAO)是否实现了CacheManagerAware,如果实现了会把CacheManager设置给它;如第九章的MySessionDAO就是带缓存的SessionDAO;其会先查缓存,如果找不到才查数据库。

对于CachingSessionDAO,可以通过如下配置设置缓存的名称:

Java代码

sessionDAO=com.github.zhangkaitao.shiro.chapter11.session.dao.MySessionDAO sessionDAO.activeSessionsCacheName=shiro-activeSessionCache activeSessionsCacheName默认就是shiro-activeSessionCache。

以上是"shiro缓存机的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

缓存 代码 信息 接口 名称 密码 篇文章 参考 示例 分析 内容 就是 测试 登录 配置 不同 成功 差不多 不怎么 中放 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会主任 科技互联网企业 互联网科技垄断 网络科技有限互联网 互联网的科技创新 银川新华互联网科技学校地址 深圳前海聚择互联网科技有限公司 新华互联网科技2019 小米互联网科技园设置 健康食品互联网创新科技园项目 华夏恒生互联网科技013171 山东星卡互联网科技有限公司官网 福州德业互联网科技 云鲸互联网络科技有限公司 兰石爱特工业互联网科技分公司 米泉互联网科技专业怎么样 广西泛欧互联网科技有限公司 互联网科技博主张洲 互联网科技创新创业项目 互联网科技快速发展优美句子 深圳九邦互联网科技有限公司 科技赋能下的互联网金融 互联网科技卖菜 互联网 新科技 北京大学互联网科技怎么样 互联网和黑科技的看法 湖南一路畅行互联网科技 广西科技产业互联网是什么 科技和互联网行业的特点 科技发展第三阶段互联网时代
0