Shiro在Spring的会话管理(session)_启示收藏的博客-程序员宝宝

技术标签: spring  shiro  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的配置将起作用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012737182/article/details/53147097

智能推荐

使用memcpy 复制unsigned int 型的数据_Alen.Wang的博客-程序员宝宝_memcpy复制int

#include#includeunsigned int flash_read(unsigned int *address,unsigned int *buf,unsigned int len){ unsigned int i; if(buf==NULL) return 1; for(i=0;i<len;i++){ *buf =*address; address+=4;

mysql-多表查询-内联查询左查询_pyhui2020的博客-程序员宝宝

》多表查询》多表练习创建了两张表第二张表的某个字段关联了第一张表插入数据查询两张表查询两张表,在一张表上显示展现的结果,笛卡尔积》理想的查询结果两个表有共同点的地方才查询出来》查询的时候带上表名称》inner join 就是内联接上面的查询都是内联接查询》使用新的表来理解连接查询一张,员工表一张部门表查看两张表的全部内容,显示笛卡尔集的结果显示...

mysql5.7.13 linux安装_Mysql入门Linux环境下mysql5.7.13安装教程_Dr.Pride的博客-程序员宝宝

《Mysql入门Linux环境下mysql5.7.13安装教程》要点:本文介绍了Mysql入门Linux环境下mysql5.7.13安装教程,希望对您有用。如果有疑问,可以联系我们。MYSQL数据库本文实例为大家分享了Linux mysql5.7.13安装教程,供大家参考,具体内容如下MYSQL数据库1、准备cmake-3.6.0.tar.gzbison-3.0.4.tar.gzmysql-5.7...

2019.3.28面试题_weixin_30871701的博客-程序员宝宝

  今天去了一家公司面试,是截止目前问得比较多的一家。下面记录一下面试的笔试题和一个实操题:笔试题: 1.typeof返回的类型:  undefined、boolean、string、number、object  注意这里没有null,null也是属于object的。 同时说一下js的数据类型这里容易和typeof搞混!   js的数据类型可以分为...

“没有找到mfc100u.dll”的解决方法_weixin_34391445的博客-程序员宝宝

现在需要安装MindManager 2016 思维导图软件时,打开软件提示找不到 mfc100u.dll,无法执行程序。之前一直好好的,现在换电脑了安装提示这个问题,然后百度找的解决方案:需要去微软官网下载组件:Visual C++ 2010 x64https://www.microsoft.com/en-us/download/details.aspx?id=14632...

Linux和windows系统之间的区别_Listen2You的博客-程序员宝宝

如今,主流的操作系统由三类,Windows和Mac OS相信大家都不陌生,他们是我们平常最熟知的操作系统。那另一种操作系统是什么呢?当然就是Linux操作系统。Linux系统正是因为它开源且免费、跨平台等优良的特性,深受码农们的喜爱。Linux在服务器端占据着霸主地位,并且在未来云计算的发展方面,它的地位也不会轻易动摇。相比于不开源的Windows和MacOS,Linux将是程序员们施展拳脚的重要根据地。目前,我们常见的网络设备的操作系统基本都是使用Linux,比如安卓系统、银行服务器、企业erp系统服

随便推点

zblog采集教程无需写入zblog采集规则_147SEO的博客-程序员宝宝_blog采集

相信很大部分的SEO朋友都有做过网站采集的事情,人工复制粘贴也属于采集的一种,也用利用采集软件、插件快速获取内容的。即便是搜索引擎推出各种各样算法来处理采集的网站,但是还是有40%的人一直做得比较好,当然这些肯定不是我们看到的这么简单。并不是我们只需要搭建好网站,然后人工复制、或者软件采集,然后坐等收录排名流量,包括我身边也有不少朋友做得确实不错,不管是收录还是排名都很好。今天小编就教大家怎么做好一个采集站!一、网站如何进行采集内容采集相信有不少人对它爱不释手,有些人对它避而远之!说爱它,.

android studio代理设置_空心菜使者的博客-程序员宝宝_androidstudio代理设置

原文网址:HTTP://developer.android.com/tools/studio/studio-config.html组态在本文档中更新频道代理设置也可以看看安装Android Studio工作流程构建系统在安装过程中,Android Studio提供验证系统需求的向导和模板,例如Java Development

Ubuntu16.04离线安装Nodejs与JDK_kyyee的博客-程序员宝宝

Linux 系统环境虚拟机:VMware 12.1.0系统版本:Ubuntu 16.04 64 位Nodejs 下载官网下载 64 位安装包 node-v6.10.3-linux-x64.tar.xznode 与 npm 的安装1.将安装包拷贝到虚拟机,解压安装包tar -xJf node-v6.10.3-linux-x64.tar.xz2.移动解压出...

程序员创业三关_weixin_34377919的博客-程序员宝宝

当人们还在浩叹第一次网络泡沫破灭的时候,互联网已经悄悄迎来了它的第二个春天;从某种意义上看,甚至已经进入了夏天——热烈但不乏浮躁、兴奋但失之肤浅。某位投资人声称今年总共有三十亿美金资本进入中国,言下之意,大家都可以甩开膀子大干快上,登陆纳市不好说,搞笔钱进来花差花差多半是没问题的。 另一方面,程序员创业,在中国乃至国外,都不是什么新鲜事儿。我们是那么一群聪明、优秀的家伙,大脑发达,点子就...

数据挖掘试题(150道)_乌恩大侠的博客-程序员宝宝

单选题某超市研究销售纪录数据后发现,买啤酒的人很大概率也会购买尿布,这种属于数据挖掘的哪类问题?(A)A. 关联规则发现 B. 聚类C. 分类 D. 自然语言处理以下两种描述分别对应哪两种对分类算法的评价标准? (A)(a)警察抓小偷,描述警察抓的人中有多少个是小偷的标准。(b)描述有多少比例的小偷给警察抓了的标准。A. Precisi...

推荐文章

热门文章

相关标签