zoukankan      html  css  js  c++  java
  • Shiro在Spring session管理

    会话管理 
    在shiro里面可以发现所有的用户的会话信息都会由Shiro来进行控制,那么也就是说只要是与用户有关的一切的处理信息操作都可以通过Shiro取得,实际上可以取得的信息可以有用户名、主机名称等等,这所有的信息都可以通过Subject接口取得。

    System.out.println("SESSION ID = " + SecurityUtils.getSubject().getSession().getId()); System.out.println("用户名:" + SecurityUtils.getSubject().getPrincipal()); System.out.println("HOST:" + SecurityUtils.getSubject().getSession().getHost()); System.out.println("TIMEOUT :" + SecurityUtils.getSubject().getSession().getTimeout()); System.out.println("START:" + SecurityUtils.getSubject().getSession().getStartTimestamp()); System.out.println("LAST:" + SecurityUtils.getSubject().getSession().getLastAccessTime());

    其中“getLastAccessTime()”这个方法表示该用户的最后一次操作时间; 现在这些基础的信息的确都取得了,可是这些都属于Shiro中的默认配置,而用户1、如果有需要也可以使用手工配置的模式完成。

    <dependency> 
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-quartz</artifactId> 
    </dependency>
    <dependency> 
        <groupId>commons-collections</groupId> 
        <artifactId>commons-collections</artifactId>
         <version>3.2.2</version> 
    </dependency>

    如果要进行session管理,一定要定期释放空间,所以这个时候一定需要定时组件才可以完成。 
    2、 可以配置一个属于自己的Session ID生成器:

    <!-- 定义Session ID生成管理器 --> 
    <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator" />

    3、 随后需要定义有一个会话的DAO处理,指的是你的会话的缓存位置,本次暂时将所有的会话数据保存在内存里面。 
    · 会话保存处理:org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO

    <!-- 配置Session DAO的操作处理 --> 
    <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> 
        <!-- 设置session缓存的名字,这个名字可以任意 --> 
        <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> 
        <!-- 定义该Session DAO操作中所使用的ID生成器 --> 
        <property name="sessionIdGenerator" ref="sessionIdGenerator"/> 
    </bean>

    4、 现在只是定义了缓存所需要的组件,但是并没有定义session与客户端的之间的联系,为了进行有效的session管理所以还需要建立有一个Cookie的操作模版。 
    · 处理Cookie:org.apache.shiro.web.servlet.SimpleCookie

    <!-- 配置需要向Cookie中保存数据的配置模版 --> 
    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 
        <!-- 在Tomcat运行下默认使用的Cookie的名字为JSESSIONID --> <constructor-arg value="mldn-session-id"/> 
        <!-- 保证该系统不会受到跨域的脚本操作供给 --> 
        <property name="httpOnly" value="true"/> 
        <!-- 定义Cookie的过期时间,单位为秒,如果设置为-1表示浏览器关闭,则Cookie消失 --> 
        <property name="maxAge" value="-1"/> 
    </bean>

    5、 定义会话管理器(sessionManager) 
    · 操作类:org.apache.shiro.web.session.mgt.DefaultWebSessionManager;

    <!-- 定义会话管理器的操作 -->
        <bean id="sessionManager"
            class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
            <!-- 定义的是全局的session会话超时时间,此操作会覆盖web.xml文件中的超时时间配置 -->
            <property name="globalSessionTimeout" value="1000000"/>
            <!-- 删除所有无效的Session对象,此时的session被保存在了内存里面 -->
            <property name="deleteInvalidSessions" value="true"/>
            <!-- 定义要使用的无效的Session定时调度器 -->
            <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
            <!-- 需要让此session可以使用该定时调度器进行检测 -->
            <property name="sessionValidationSchedulerEnabled" value="true"/>
            <!-- 定义Session可以进行序列化的工具类 -->
            <property name="sessionDAO" ref="sessionDAO"/>
            <!-- 所有的session一定要将id设置到Cookie之中,需要提供有Cookie的操作模版 -->
            <property name="sessionIdCookie" ref="sessionIdCookie"/>
            <!-- 定义sessionIdCookie模版可以进行操作的启用 -->
            <property name="sessionIdCookieEnabled" value="true"/>
        </bean> 

    6、 所有的session一定要在用户正确离开之后才能够进行资源的释放,但是用户如果不点注销,不能够进行session的清空处理,所以为了防止这样的问题,还需要增加有一个会话的验证调度器。 
    · 调度器程序类:org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler

    <!-- 配置session的定时验证检测程序类,以让无效的session释放 -->
        <bean id="sessionValidationScheduler"
            class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
            <!-- 设置session的失效扫描间隔,单位为毫秒 -->
            <property name="sessionValidationInterval" value="100000"/>
            <!-- 随后还需要定义有一个会话管理器的程序类的引用 -->
            <property name="sessionManager" ref="sessionManager"/>
        </bean> 

    7、 随后需要修改安全管理器:

    <!-- 配置SecurityManager的管理 -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <!-- 配置你需要使用的Realms -->
            <property name="realm" ref="memberRealm"/>
            <property name="cacheManager" ref="cacheManager"/>
            <!-- 定义要使用的session管理器 -->
            <property name="sessionManager" ref="sessionManager"/>
        </bean>

    此时就表示当前WEB开发中的所有的session的处理操作都交由Shiro来进行操作控制。 
    8、 另外的方法: 
    · 更新会话:SecurityUtils.getSubject().getSession().touch(); 
    停止会话:SecurityUtils.getSubject().getSession().stop(); 
    |-相当于WEB开发中的:session.invalidate()方法的执行; 
    |-注销:SecurityUtils.getSubject().logout()。


    Shiro对于Session管理有自己的实现机制,这些机制如果与WEB的操作重叠了,那么Shiro的配置将起作用。

  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/jtlgb/p/9577617.html
Copyright © 2011-2022 走看看