前言
本章讲解shiro中缓存和会话的管理
方法
1.概念
在之前的例子中我们发现,我们每一次访问需要一定权限的url是,程序将自动的去数据库中查询所需要的角色权限信息,一旦我们的菜单和按钮上写入的控制太多,那么将对应查询很多次数据库。
上面显示,我们每次访问需要权限的页面都需要去数据库查询相应的角色和权限。
为了避免上面的问题,我们可以配置shiro的缓存。
2.shiro缓存管理
1)引入shiro缓存相关的jar包
2)配置shiro配置文件
<!-- 配置Shiro的SecurityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/>
<property name="cacheManager" ref="cacheManager"/>
</bean>
<!-- 缓存管理器 使用Ehcache实现 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
</bean>
3)配置ehcache.xml
这里使用hibernate中使用到的一个就可以了。
4)测试程序
这个时候,我们发现userRealm里的授权方法只是走了一次,成功实现缓存。
那么,有人可能会问了,我要是在后台把它的权限更改了,你还读缓存,那不是出错了吗?
没关系,shiro早就给我们准备好了刷新缓存的功能,只需要在权限更新的时候执行一次这个方法就行了。
将该方法写在userRealm下,如果有需要直接可以进行调用!!
/**
* 清理缓存
*/
public void clearCache() {
Subject currentUser = SecurityUtils.getSubject();
super.clearCache(currentUser.getPrincipals());
}
3.shiro会话管理
我们知道,shiro可以管理我们的session,诸如设置session有效时间等等。
1)配置shiro配置文件
<!-- 配置Shiro的SecurityManager -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/>
<property name="cacheManager" ref="cacheManager"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- 配置session的失效时间 -->
<property name="globalSessionTimeout" value="10000"/>
<!-- 删除无效的session -->
<property name="deleteInvalidSessions" value="true"/>
</bean>
这就完事了。
2)验证程序
上面我们配置了10s(10000ms)后session失效,也就是说要重新登录,我们来验证一下:
当我们成功使用zhangsan登录之后,静静的等待10s没有操作,我们会发现再次刷新页面又回到了登录页: