一、Shiro Session 的基本功能
所有的用户的会话信息都会由Shiro来进行控制,那么也就是说只要是与用户有关的一切的处理信息操作都可以通过Shiro取得,实际上Shiro的会话能够获取到HttpSession中存储的值,这所有的信息都可以通过Subject接口取得。
在Controller层,我们建议大家使用原生的HttpSession。那么Shiro的Session有什么意义呢?
一般来说,Controller层使用原生的HttpSession对象,在Service层中使用Shiro提供的Session对象。如果在Service层中使用HttpSession对象,那么属于侵入式,并不建议这么做。Shiro提供的Session能够很好的解决这个问题。
Shiro的核心API如下:
Subject.getSession() 获取Shiro的session
session.setAttribute(key,val) & session.getAttribute(key) & session.removeAttribute(key)
session.getId() 获取会话ID
session.getTimeout() & session.setTimeout(毫秒) 设置/获取当前Session的过期时间。
session.getStartTimestamp() & session.getLastAccessTime() 获取会话的启动时间及最后访问时间
session.stop() Subject.logout()会自动调用session.stop()。
二、简单集成
如果要进行session管理,一定要定期释放空间,所以这个时候一定需要定时组件才可以完成。
一般使用的就是定时任务组件Quartz,Shiro已经给我们配置好了。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-quartz</artifactId>
<version>1.4.0</version>
</dependency>
关于如何在shiro中配置SessionManager,像下面一样配置即可。
globalSessionTimeout:全局 session 过期时间,单位是 毫秒
sessionValidationScheduler:定时任务,用于扫描会话
sessionDao: 主要实现 session 的增删改查
sessionIdCookie :sessionManager需要使用会话cookie模版
<!-- securityManager 对象-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
...
<!-- 引入sessionManager-->
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话管理器 ,时间单位是毫秒-->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!--去掉URL中的JSESSIONID-->
<property name="sessionIdUrlRewritingEnabled" value="false"/>
<!-- 会话存活时间(毫秒) -->
<property name="globalSessionTimeout" value="600000"/><!-- 10分钟 -->
<!-- 是否删除无效的session-->
<property name="deleteInvalidSessions" value="true"/>
<!-- 扫描session线程,负责清理超时会话 -->
<property name="sessionValidationSchedulerEnabled" value="true"/>
<!-- 使用的是QuartZ组件来定时清理-->
<property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
<!-- session需要使用会话cookie模版-->
<property name="sessionIdCookieEnabled" value="true"/>
<property name="sessionIdCookie" ref="sessionIdCookie"/>
<!-- 对session进行增删错改查的实现类 -->
<property name="sessionDAO" ref="sessionDAO"/>
</bean>
<!-- 会话验证调度器 ,时间单位是毫秒。使用的是Quartz定时任务-->
<bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.
QuartzSessionValidationScheduler">
<!-- 每5分钟进行一次扫描-->
<property name="sessionValidationInterval" value="300000"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- 会话 ID 生成器 -->
<bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
<!-- 会话读写实现类-->
<bean id="sessionDAO" class="org.apache.shiro.session.mgt.
eis.EnterpriseCacheSessionDAO">
<property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
<property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
三、Shiro会话获取HttpSession中储存的值
首先启动项目后,来到项目的首页。
点击第一个超链接"测试超链接",发送访问项目数据库的请求。因为用户没有登录,所以被强制重定向到了登录页面。
在登录页面输入 jay /123456 后,点击提交,发送表单请求。在处理此请求的Controller层里面,我把一个值存放到了HttpSession里面。
设置一组键值对 "abc"--"def"到HttpSession中。
此请求执行完毕后,返回到登录成功页面。
再点击"进入管理员页面"超链接,返送相关请求。后台处理此请求的Controller里面,使用Shiro获取到Shiro的会话Session,尝试获取到Key为"abc"的键值对的值。在控制台打印出"def",说明Shiro提供的会话session能够正确的从HttpSession中获取键值对。同时也证明本次集成Shiro会话成功。
四、源码下载
本章节项目源码:点击我下载源码
----------------------------------------------------分割线-------------------------------------------------------
下一篇:第十三节 Shiro集成Redis实现分布式Session共享