第十二节 Shiro会话管理

x33g5p2x  于2021-12-18 转载在 其他  
字(3.8k)|赞(0)|评价(0)|浏览(260)

一、Shiro Session 的基本功能

      在Shiro里面可以发现所有的用户的会话信息都会由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会话成功。

四、源码下载

     本章节项目源码:点击我下载源码

相关文章