Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。对于Cache的一些概念可以参考我的《Spring Cache抽象详解》:http://jinnianshilongnian.iteye.com/blog/2001040。
Shiro提供的Cache接口:
- public interface Cache<K, V> {
- //根据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<K> keys();
- //获取缓存中所有的value
- public Collection<V> values();
- }
Shiro提供的CacheManager接口:
- public interface CacheManager {
- //根据缓存名字获取一个Cache
- public <K, V> Cache<K, V> getCache(String name) throws CacheException;
- }
Shiro还提供了CacheManagerAware用于注入CacheManager:
- public interface CacheManagerAware {
- //注入CacheManager
- void setCacheManager(CacheManager cacheManager);
- }
Shiro内部相应的组件(DefaultSecurityManager)会自动检测相应的对象(如Realm)是否实现了CacheManagerAware并自动注入相应的CacheManager。
本章用例使用了与第六章的代码。
Realm缓存
Shiro提供了CachingRealm,其实现了CacheManagerAware接口,提供了缓存的一些基础实现;另外AuthenticatingRealm及AuthorizingRealm分别提供了对AuthenticationInfo 和AuthorizationInfo信息的缓存。
ini配置
- userRealm=com.github.zhangkaitao.shiro.chapter11.realm.UserRealm
- userRealm.credentialsMatcher=$credentialsMatcher
- userRealm.cachingEnabled=true
- userRealm.authenticationCachingEnabled=true
- userRealm.authenticationCacheName=authenticationCache
- userRealm.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());
测试用例
- @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;
- @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实现:
Session缓存
当我们设置了SecurityManager的CacheManager时,如:
- securityManager.cacheManager=$cacheManager
当我们设置SessionManager时:
- sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager
- securityManager.sessionManager=$sessionManager
如securityManager实现了SessionsSecurityManager,其会自动判断SessionManager是否实现了CacheManagerAware接口,如果实现了会把CacheManager设置给它。然后sessionManager会判断相应的sessionDAO(如继承自CachingSessionDAO)是否实现了CacheManagerAware,如果实现了会把CacheManager设置给它;如第九章的MySessionDAO就是带缓存的SessionDAO;其会先查缓存,如果找不到才查数据库。
对于CachingSessionDAO,可以通过如下配置设置缓存的名称:
- sessionDAO=com.github.zhangkaitao.shiro.chapter11.session.dao.MySessionDAO
- sessionDAO.activeSessionsCacheName=shiro-activeSessionCache
activeSessionsCacheName默认就是shiro-activeSessionCache。
相关推荐
第十一章 缓存机制 第十二章 与Spring集成 第十三章 RememberMe 第十四章 SSL 第十五章 单点登录 第十六章 综合实例 第十七章 OAuth2集成 第十八章 并发登录人数控制 第十九章 动态URL权限控制 第二十章 无状态Web...
第十一章 输出非HTML的内容 第十二章 会话、用户和注册 第十三章 缓存机制 第十四章 集成的子框架 第十五章 中间件 完成度 第十六章 集成已有数据库和应用 第十七章 解读Django的管理界面 第十八章 国际化 第十九章 ...
第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 第十五章: 缓存机制 第十六章: 集成的子框架 django.contrib 第十七章: 中间件 第十八章: 集成已有的...
第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 第十五章: 缓存机制 第十六章 集成的子框架 django.contrib 第十七章: 中间件 第十八章: 集成...
第十一章:通用视图 阅读 11 第二十章: 部署Django 阅读 12 第十三章: 输出非HTML内容 阅读 13 第十四章: 会话、用户和注册 阅读 14 第十五章: 缓存机制 阅读 15 第十四章 集成的子框架 django.contrib 阅读 16 ...
《Asp.net 3.5 Unleashed》是一本深入探讨Asp.net 3.5技术的专业书籍,其中第十一章至第二十章是关于Asp.net 3.5核心特性和高级应用的重要部分。这些章节涵盖了从网页设计、数据访问、用户验证到企业级应用开发等多...
第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 第十五章: 缓存机制 第十六章 集成的子框架 第十七章: 中间件 第十八章: 集成已有的数据库和应用 第十九章...
第十一章:通用视图 第十二章:部署Django 第十三章:输出非HTML内容 第十四章:会话、用户和注册 第十五章:缓存机制 第十六章:集成的子框架 django.contrib 第十七章:中间件 第十八章:集成已有的数据库...
Web服务器可以通过缓存机制、开启HTTP/2协议、压缩响应内容、减少DNS查询时间等方式提升性能。同时,监控服务器的CPU、内存、网络等资源使用情况,及时调整配置,也是确保服务器高效运行的关键。 总之,Web服务器...
第十一章信号 第十二章虚拟文件系统 第十三章I/O体系结构和设备驱动程序 第十四章块设备驱动程序 第十五章页高速缓存 第十六章访问文件 第十七章回收页框 第十八章Ext2和Ext3文件系统 第十九章进程通信 第二十章...
第十一章信号 第十二章虚拟文件系统 第十三章I/O体系结构和设备驱动程序 第十四章块设备驱动程序 第十五章页高速缓存 第十六章访问文件 第十七章回收页框 第十八章Ext2和Ext3文件系统 第十九章进程通信 第二十章...
第十一章信号 第十二章虚拟文件系统 第十三章I/O体系结构和设备驱动程序 第十四章块设备驱动程序 第十五章页高速缓存 第十六章访问文件 第十七章回收页框 第十八章Ext2和Ext3文件系统 第十九章进程通信 第二十章...
- **第11章.用户控件和自定义控件**:展示了如何创建和使用自定义的用户控件,增强可重用性。 - **第15章.图形图像编程**:探讨如何在ASP.NET中处理图像,包括绘制、转换、裁剪等。 这些章节的内容共同构成了ASP...
第十一章通常会探讨数据库性能优化,涵盖索引的原理与使用、查询优化、存储策略(如分区、簇、缓存)以及数据库的备份与恢复策略。 通过这些PPT讲义,学习者不仅可以掌握数据库的基本概念,还能深入了解关系数据库...
### 数据结构第十一章知识点详解 #### 一、章节概述 本章节主要介绍了高级线性表中的几个核心概念和技术,包括多维数组、广义表以及存储管理技术。通过学习这些内容,我们可以更好地理解如何有效地组织和处理复杂的...
**第十一章:ASP.NET安全性** 安全性是Web开发的重要议题。这一章可能涉及身份验证(如Forms Authentication)、授权、角色管理以及防止SQL注入和跨站脚本攻击。 **第十二章:ASP.NET缓存** 学习如何利用ASP.NET的...
第十一章:通用视图 完成度 100.00% 第二十章: 部署Django 完成度 100.00% 第十三章: 输出非HTML内容 完成度 100.00% 第十四章: 会话、用户和注册 完成度 86.16% 第十五章: 缓存机制 完成度 100.00% 第十四...
第十一章:通用视图 完成度 100.00% 阅读 翻译 第十二章: 部署Django 完成度 100.00% 阅读 翻译 第十三章: 输出非HTML内容 完成度 100.00% 阅读 翻译 第十四章: 会话、用户和注册 完成度 86.16% 阅读 翻译 第十五...
翻译第十一章:通用视图 完成度 100.00% 阅读 翻译第十二章: 部署Django 完成度 100.00% 阅读 翻译第十三章: 输出非HTML内容 完成度 100.00% 阅读 翻译第十四章: 会话、用户和注册 完成度 86.16% 阅读 翻译第十五...