`

第十一章 缓存机制

 
阅读更多

Shiro提供了类似于SpringCache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。对于Cache的一些概念可以参考我的《Spring Cache抽象详解》:http://jinnianshilongnian.iteye.com/blog/2001040

 

Shiro提供的Cache接口: 

Java代码  收藏代码
  1. public interface Cache<K, V> {  
  2.     //根据Key获取缓存中的值  
  3.     public V get(K key) throws CacheException;  
  4.     //往缓存中放入key-value,返回缓存中之前的值  
  5.     public V put(K key, V value) throws CacheException;   
  6.     //移除缓存中key对应的值,返回该值  
  7.     public V remove(K key) throws CacheException;  
  8.     //清空整个缓存  
  9.     public void clear() throws CacheException;  
  10.     //返回缓存大小  
  11.     public int size();  
  12.     //获取缓存中所有的key  
  13.     public Set<K> keys();  
  14.     //获取缓存中所有的value  
  15.     public Collection<V> values();  
  16. }  

  

Shiro提供的CacheManager接口: 

Java代码  收藏代码
  1. public interface CacheManager {  
  2.     //根据缓存名字获取一个Cache  
  3.     public <K, V> Cache<K, V> getCache(String name) throws CacheException;  
  4. }  

  

Shiro还提供了CacheManagerAware用于注入CacheManager 

Java代码  收藏代码
  1. public interface CacheManagerAware {  
  2.     //注入CacheManager  
  3.     void setCacheManager(CacheManager cacheManager);  
  4. }  

 

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

  

本章用例使用了与第六章的代码。

 

Realm缓存

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

 

ini配置   

Java代码  收藏代码
  1. userRealm=com.github.zhangkaitao.shiro.chapter11.realm.UserRealm  
  2. userRealm.credentialsMatcher=$credentialsMatcher  
  3. userRealm.cachingEnabled=true  
  4. userRealm.authenticationCachingEnabled=true  
  5. userRealm.authenticationCacheName=authenticationCache  
  6. userRealm.authorizationCachingEnabled=true  
  7. userRealm.authorizationCacheName=authorizationCache  
  8. securityManager.realms=$userRealm  
  9.   
  10. cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager  
  11. cacheManager.cacheManagerConfigFile=classpath:shiro-ehcache.xml  
  12. 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

 

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

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

改为

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

 

测试用例 

Java代码  收藏代码
  1. @Test  
  2. public void testClearCachedAuthenticationInfo() {  
  3.     login(u1.getUsername(), password);  
  4.     userService.changePassword(u1.getId(), password + "1");  
  5.   
  6.     RealmSecurityManager securityManager =  
  7.      (RealmSecurityManager) SecurityUtils.getSecurityManager();  
  8.     UserRealm userRealm = (UserRealm) securityManager.getRealms().iterator().next();  
  9.     userRealm.clearCachedAuthenticationInfo(subject().getPrincipals());  
  10.   
  11.     login(u1.getUsername(), password + "1");  
  12. }   

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

 

Java代码  收藏代码
  1. @Test  
  2. public void testClearCachedAuthorizationInfo() {  
  3.     login(u1.getUsername(), password);  
  4.     subject().checkRole(r1.getRole());  
  5.     userService.correlationRoles(u1.getId(), r2.getId());  
  6.   
  7.     RealmSecurityManager securityManager =  
  8.       (RealmSecurityManager) SecurityUtils.getSecurityManager();  
  9.     UserRealm userRealm = (UserRealm)securityManager.getRealms().iterator().next();  
  10.     userRealm.clearCachedAuthorizationInfo(subject().getPrincipals());  
  11.   
  12.     subject().checkRole(r2.getRole());  
  13. }   

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

 

另外还有clearCache,其同时调用clearCachedAuthenticationInfoclearCachedAuthorizationInfo,清空AuthenticationInfoAuthorizationInfo

 

UserRealm还提供了clearAllCachedAuthorizationInfoclearAllCachedAuthenticationInfoclearAllCache,用于清空整个缓存。

 

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

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

 

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

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

 

Session缓存

当我们设置了SecurityManagerCacheManager时,如:

Java代码  收藏代码
  1. securityManager.cacheManager=$cacheManager  

 

当我们设置SessionManager时:

Java代码  收藏代码
  1. sessionManager=org.apache.shiro.session.mgt.DefaultSessionManager  
  2. securityManager.sessionManager=$sessionManager   

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

 

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

Java代码  收藏代码
  1. sessionDAO=com.github.zhangkaitao.shiro.chapter11.session.dao.MySessionDAO  
  2. sessionDAO.activeSessionsCacheName=shiro-activeSessionCache   

activeSessionsCacheName默认就是shiro-activeSessionCache

分享到:
评论

相关推荐

    Shiro学习教程源代码

    第十一章 缓存机制 第十二章 与Spring集成 第十三章 RememberMe 第十四章 SSL 第十五章 单点登录 第十六章 综合实例 第十七章 OAuth2集成 第十八章 并发登录人数控制 第十九章 动态URL权限控制 第二十章 无状态Web...

    django从入门到深入WEB教程

    第十一章 输出非HTML的内容 第十二章 会话、用户和注册 第十三章 缓存机制 第十四章 集成的子框架 第十五章 中间件 完成度 第十六章 集成已有数据库和应用 第十七章 解读Django的管理界面 第十八章 国际化 第十九章 ...

    Django_中文教程.rar

    第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 第十五章: 缓存机制 第十六章: 集成的子框架 django.contrib 第十七章: 中间件 第十八章: 集成已有的...

    python django建站教程

    第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 第十五章: 缓存机制 第十六章 集成的子框架 django.contrib 第十七章: 中间件 第十八章: 集成...

    The-Django-Book中文版

    第十一章:通用视图 阅读 11 第二十章: 部署Django 阅读 12 第十三章: 输出非HTML内容 阅读 13 第十四章: 会话、用户和注册 阅读 14 第十五章: 缓存机制 阅读 15 第十四章 集成的子框架 django.contrib 阅读 16 ...

    Asp.net 3.5 Unleashed 揭秘 源码第十一章到二十章 非Chm格式的

    《Asp.net 3.5 Unleashed》是一本深入探讨Asp.net 3.5技术的专业书籍,其中第十一章至第二十章是关于Asp.net 3.5核心特性和高级应用的重要部分。这些章节涵盖了从网页设计、数据访问、用户验证到企业级应用开发等多...

    Django Web框架入门到精通 中文版

    第十一章:通用视图 第十二章: 部署Django 第十三章: 输出非HTML内容 第十四章: 会话、用户和注册 第十五章: 缓存机制 第十六章 集成的子框架 第十七章: 中间件 第十八章: 集成已有的数据库和应用 第十九章...

    djangoBook 中文 v1.0 v2.0 合并美化版 原创

    第十一章:通用视图 第十二章:部署Django 第十三章:输出非HTML内容 第十四章:会话、用户和注册 第十五章:缓存机制 第十六章:集成的子框架 django.contrib 第十七章:中间件 第十八章:集成已有的数据库...

    第11章 Web Server程序

    Web服务器可以通过缓存机制、开启HTTP/2协议、压缩响应内容、减少DNS查询时间等方式提升性能。同时,监控服务器的CPU、内存、网络等资源使用情况,及时调整配置,也是确保服务器高效运行的关键。 总之,Web服务器...

    深入理解linux内核第三版中文版.part3.rar

    第十一章信号 第十二章虚拟文件系统 第十三章I/O体系结构和设备驱动程序 第十四章块设备驱动程序 第十五章页高速缓存 第十六章访问文件 第十七章回收页框 第十八章Ext2和Ext3文件系统 第十九章进程通信 第二十章...

    深入理解linux内核第三版中文版.part4.rar

    第十一章信号 第十二章虚拟文件系统 第十三章I/O体系结构和设备驱动程序 第十四章块设备驱动程序 第十五章页高速缓存 第十六章访问文件 第十七章回收页框 第十八章Ext2和Ext3文件系统 第十九章进程通信 第二十章...

    深入理解linux内核第三版中文版.part6.rar

    第十一章信号 第十二章虚拟文件系统 第十三章I/O体系结构和设备驱动程序 第十四章块设备驱动程序 第十五章页高速缓存 第十六章访问文件 第十七章回收页框 第十八章Ext2和Ext3文件系统 第十九章进程通信 第二十章...

    第13章.ASP.NET内置对象,应用程序配置和缓存.doc

    - **第11章.用户控件和自定义控件**:展示了如何创建和使用自定义的用户控件,增强可重用性。 - **第15章.图形图像编程**:探讨如何在ASP.NET中处理图像,包括绘制、转换、裁剪等。 这些章节的内容共同构成了ASP...

    王珊数据库系统概论(第五版)第1到11章PPT

    第十一章通常会探讨数据库性能优化,涵盖索引的原理与使用、查询优化、存储策略(如分区、簇、缓存)以及数据库的备份与恢复策略。 通过这些PPT讲义,学习者不仅可以掌握数据库的基本概念,还能深入了解关系数据库...

    数据结构第十一章课件

    ### 数据结构第十一章知识点详解 #### 一、章节概述 本章节主要介绍了高级线性表中的几个核心概念和技术,包括多维数组、广义表以及存储管理技术。通过学习这些内容,我们可以更好地理解如何有效地组织和处理复杂的...

    北大青鸟 ACCP 之 asp.net 8 - 14 章

    **第十一章:ASP.NET安全性** 安全性是Web开发的重要议题。这一章可能涉及身份验证(如Forms Authentication)、授权、角色管理以及防止SQL注入和跨站脚本攻击。 **第十二章:ASP.NET缓存** 学习如何利用ASP.NET的...

    The Django Book 2.0中文修正版

    第十一章:通用视图 完成度 100.00% 第二十章: 部署Django 完成度 100.00% 第十三章: 输出非HTML内容 完成度 100.00% 第十四章: 会话、用户和注册 完成度 86.16% 第十五章: 缓存机制 完成度 100.00% 第十四...

    The Django Book 2.0中文译本.pdf

    第十一章:通用视图 完成度 100.00% 阅读 翻译 第十二章: 部署Django 完成度 100.00% 阅读 翻译 第十三章: 输出非HTML内容 完成度 100.00% 阅读 翻译 第十四章: 会话、用户和注册 完成度 86.16% 阅读 翻译 第十五...

    Django Book 2.0中文译本_understandingb8a_Book2_python_django_

    翻译第十一章:通用视图 完成度 100.00% 阅读 翻译第十二章: 部署Django 完成度 100.00% 阅读 翻译第十三章: 输出非HTML内容 完成度 100.00% 阅读 翻译第十四章: 会话、用户和注册 完成度 86.16% 阅读 翻译第十五...

Global site tag (gtag.js) - Google Analytics