title: springrain技术详解(4)-shiro的缓存 CreateTime: 2013-12-15 15:27:00 UpdateTime: 2013-12-15 15:27:00 CategoryName: web --- --- title: "springrain技术详解(4)-shiro的缓存" date: 2013-12-15T15:27:00+08:00 draft: false tags: ["springrain"] categories: ["web"] author: "springrain" --- 因为是权限拦截校验,很多方法调用的频率是非常频繁的,为了更好的性能,shiro拥有一套完整的缓存体系,特别是针对web领域,做了部分增强. ## shiro权限管理器的配置: ```xml ``` cacheManager就是shiro的缓存管理器,springrain默认使用了shiro提供的MemoryConstrainedCacheManager,也可以实现相应的接口,实现自定义的cacheManager,例如springrain扩展的ShiroRedisCacheManager. 缓存的用途主要是两个. * 权限相关的授权,要是每次都从数据库查询,太不合理了. * 对session对象的缓存,实现分布式的session共享. ## 授权和认证 授权当然是有realm来做了,看下springrain中shiroDbRealm对缓存的支持. ```java public ShiroDbRealm() { // 认证缓存 // super.setAuthenticationCacheName(GlobalStatic.authenticationCacheName); super.setAuthenticationCachingEnabled(false); // 授权缓存 super.setAuthorizationCacheName(GlobalStatic.authorizationCacheName); } ``` 认证是不想缓存的,登陆的时候查询一下数据库也没有什么,所以设置了false,授权是要缓存的,也指定了缓存的名称,主要是为了刷新用户的权限缓存. 这样用户每次校验用户的访问权限,就不需要再查询数据库了. 对于缓存的刷新,shiro也提供了方法,接着上例说,管理员修改了一个角色的访问权限,这个时候需要对缓存刷新. 在[UserRoleMenuServiceImpl](https://gitee.com/chunanyong/springrain/blob/SpringRainV4.0.0/src/main/java/org/springrain/system/service/impl/UserRoleMenuServiceImpl.java)中进行了缓存手动刷新 ```java public void updateRoleMenu(String roleId,String[] menus) throws Exception { //刷新权限缓存 shiroCacheManager.getCache(GlobalStatic.authorizationCacheName).clear(); ....... } ``` 以上就是对shiro cahce的简单使用, 下一篇说下shiro对httpsession的缓存处理.