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的配置将起作用。

  • 相关阅读:
    js根据年份获取某月份有几天
    java 时间转换去杠
    简单Maven Dos命令语句
    Maven命令参数
    Redis学习推荐
    Java中Redis缓存
    oracle新建登录用户sql语句
    ORacle修改表列长度
    jsp利用application统计在线人数的方法
    Oracle之分页查询
  • 原文地址:https://www.cnblogs.com/jtlgb/p/9577617.html
Copyright © 2011-2022 走看看