使用缓存,可以解决每次访问请求都查数据库的问题。第一次授权后存入缓存。
缓存流程
shiro中提供了对认证信息和授权信息的缓存。shiro默认是关闭认证信息缓存的,对于授权信息的缓存shiro默认开启的。主要研究授权信息缓存,因为授权的数据量大。
用户认证通过。
该 用户第一次授权:调用realm查询数据库
该 用户第二次授权:不调用realm查询数据库,直接从缓存中取出授权信息(权限标识符)。
-------------------------------------使用ehcache缓存框架------------------------------
添加Jar包:
配置cacheManager
注入securityManager
classpath下配置shiro-ehcache.xml
到这里就可以使用缓存了,用户登进去一次之后访问系统不会每次都查询数据库查询权限
------------------------------------------------缓存清-空--------------------------
如果用户正常退出,缓存自动清空。
如果用户非正常退出,缓存自动清空。
如果修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。
需要手动进行编程实现:
在权限修改后调用realm的clearCache方法清除缓存。
正常开发时要放在service中调用。
在service中,权限修改后调用realm的清空缓存方法。
在realm中定义clearCached方法:
// 清除缓存 public void clearCached() { PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals(); super.clearCache(principals); }
测试清除缓存controller方法: