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

原文地址:https://www.cnblogs.com/jtlgb/p/9577617.html

时间: 2024-08-29 02:59:03

Shiro在Spring session管理的相关文章

细说shiro之六:session管理

官网:https://shiro.apache.org/ - org.apache.shiro.session.Session - org.apache.shiro.session.mgt.DelegatingSession - org.apache.shiro.web.session.HttpServletSession - org.apache.shiro.session.ProxiedSession - org.apache.shiro.session.mgt.ImmutableProxi

008-shiro与spring web项目整合【二】认证、授权、session管理

一.认证 1.添加凭证匹配器 添加凭证匹配器实现md5加密校验. 修改applicationContext-shiro.xml: <!-- realm --> <bean id="customRealm" class="com.lhx.ssm.shiro.CustomRealm"> <!-- 将凭证匹配器设置到realm中,realm按照凭证匹配器的要求进行散列 --> <property name="creden

shiro session和Spring session一样吗?

出自:https://my.oschina.net/thinwonton/blog/979118?spm=a2c4e.11153940.blogcont114167.11.69291684fUuBWM 1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小纠纠. (1)在spring controller中,request有何不同呢? 于是,在cont

Shiro企业级实战详解,统一的Session管理。

基础的什么配置这些都不说了,百度一下什么都有,直接上干货. Shiro切入点是从web.xml文件,通过filter进行拦截. 直接看DelegatingFilterProxy这个类,很简单,父类就是一个filter,肯定会初始化filter,后面会调用这个方法: @Override protected void initFilterBean() throws ServletException { synchronized (this.delegateMonitor) { if (this.de

转:通过Spring Session实现新一代的Session管理

长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应用(cloud native application),它们会挑战过去20多年来我们设计和构建session管理器时的前提假设,并且暴露了现代化session管理器的不足. 本文将会阐述最近发布的Spring Session API如何帮助我们克服眼下session管理方式中的一些不足,在企业级Ja

使用Spring Session做分布式会话管理

在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将session管理从容器中独立出来.而这实现方案有很多种,下面简单介绍下: 第一种是使用容器扩展来实现,大家比较容易接受的是通过容器插件来实现,比如基于Tomcat的tomcat-redis-session-manager,基于Jetty的jetty-session-redis等等.好处是对项目来说

[转] Spring的session管理

Session管理是企业级Java中的一部分.随着现在的趋势朝着微服务以及可水平扩展的原生云应用发展,传统的session管理逐渐暴露出自己的不足. 本文阐述spring session API如何革新过去的session管理的不足.先阐述一下当前session管理中的问题,然后深入介绍Spring session如何解决这些问题的.最后,将会详细展示Spring session如何运行的,及在项目中怎样使用它. Spring session带来的新功能如下,使得如下功能更加容易实现: 1. 编

Spring Security 入门(1-13)Spring Security - Session管理

session 管理 Spring Security 通过 http 元素下的子元素 session-management 提供了对 Http Session 管理的支持. 检测 session 超时 Spring Security 可以在用户使用已经超时的 sessionId 进行请求时将用户引导到指定的页面.这个可以通过如下配置来实现. <security:http> ... <!-- session 管理,invalid-session-url 指定使用已经超时的 sessionI

shiro session管理

http://shiro.apache.org/session-management.html Using Sessions The SessionManager Session Timeout Per-Session Timeout Session Listeners Session Storage EHCache SessionDAO EHCache Session Cache Configuration EHCache Session Cache Name Custom Session I