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的配置将起作用。
Shiro在Spring session管理的更多相关文章
- Shiro权限管理框架(四):深入分析Shiro中的Session管理
其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...
- 细说shiro之六:session管理
官网:https://shiro.apache.org/ 我们先来看一下shiro中关于Session和Session Manager的类图. 如上图所示,shiro自己定义了一个新的Session接 ...
- Shiro session和Spring session一样吗?
出自:https://yq.aliyun.com/articles/114167?t=t1 1. 疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢 ...
- 008-shiro与spring web项目整合【二】认证、授权、session管理
一.认证 1.添加凭证匹配器 添加凭证匹配器实现md5加密校验. 修改applicationContext-shiro.xml: <!-- realm --> <bean id=&q ...
- 【权限管理】Apache Shiro和Spring Security的对比
一.Shiro简介 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Secu ...
- 使用Spring Session做分布式会话管理
在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...
- Spring aop与HibernateTemplate——session管理(每事务一次 Session)
一.HibernateTemplate与Spring aop简介 参见http://bbs.csdn.net/topics/340207475中网友blueram的发言.(感谢blueram) 二.在 ...
- Shiro Quartz之Junit測试Session管理
Shiro的quartz主要API上提供了org.apache.shiro.session.mgt.quartz下session管理的两个类:QuartzSessionValidationJob和Qu ...
- Spring如何管理Session【转贴】
在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的.在利用Spring + Hibernate进行开发时也是如此.下面是一个简单的Spr ...
随机推荐
- linux 查看磁盘空间
linux 查看磁盘空间大小命令 df :命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息 df -hl:查看磁盘剩余空间信息,显示如下: 文件系统 ...
- 【Social listening实操】如何运用免费的大数据工具获得行业洞察?
本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 当我们想要创业却对市场行情不甚了解,该如何迅速了解市场行情 ...
- python中的count
count(self, sub, start=None, end = None)用于计算字符串中子序列的个数,sub, start=None, end = None定义查找范围,不写默认查找全部 举个 ...
- linux base shell 基础语法2
转载 http://blog.csdn.net/aggrelxf/article/details/8263110 单引 双引 反引用[] [[]] 将命令的输出读入一个变量中,可以将它放入双引号中,即 ...
- flex学习笔记 使用函数,显示实时更新的标签
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...
- 转载:python 的包导入
python 包 多个关系密切的模块应该组织成一个包,以便于维护和使用.这项技术能有效避免名字空间冲突.创建一个名字为包名字的文件夹并在该文件夹下创建一个__init__.py 文件就定义了一个包.你 ...
- 构建最小JDK Docker镜像
参考: https://my.oschina.net/shyloveliyi/blog/1627020 1.首先下载jre,下载地址是https://www.java.com/en/download/ ...
- kubernetes国内镜像拉取
因国内访问不到goole服务器,只能拉取国内的镜像,这里以阿里云为例. 安装minikube时报failed to pull image "k8s.gcr.io/kube-apiserver ...
- 爬虫--Scrapy-CrawlSpider&基于CrawlSpide的分布式爬虫
CrawlSpider 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调par ...
- JSdom操作内容,样式,属性
<p> JavaScript 能够直接写入 HTML 输出流中: </p> <script> document.write("<h1>This ...