Shiro配置cookie以及共享Session和Session失效问题
首先我们看Shiro的会话管理器的配置
- <!-- shiro会话管理 -->
- <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 -->
- <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
- <property name="cacheManager" ref="redisCacheManager"/>
- <property name="sessionDAO" ref="redisSessionDAO"/>
- <!-- <property name="sessionIdCookie" ref="simpleCookie"/> -->
- <!-- 全局的会话信息时间,,单位为毫秒 -->
- <property name="globalSessionTimeout" value="1800000"/>
- <!-- 检测扫描信息时间间隔,单位为毫秒-->
- <property name="sessionValidationInterval" value="60000"/>
- <!-- 是否开启扫描 -->
- <property name="sessionValidationSchedulerEnabled" value="false"/>
- <!-- 去掉URL中的JSESSIONID -->
- <property name="sessionIdUrlRewritingEnabled" value="true"/>
- </bean>
这里是使用DefaultWebSessionManager默认的Cookie配置
部分源代码
- public class DefaultWebSessionManager extends DefaultSessionManager implements WebSessionManager {
- private static final Logger log = LoggerFactory.getLogger(DefaultWebSessionManager.class);
- private Cookie sessionIdCookie;
- private boolean sessionIdCookieEnabled;
- private boolean sessionIdUrlRewritingEnabled;
- public DefaultWebSessionManager() {
- Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
- cookie.setHttpOnly(true); //more secure, protects against XSS attacks
- this.sessionIdCookie = cookie;
- this.sessionIdCookieEnabled = true;
- this.sessionIdUrlRewritingEnabled = true;
- }
- }
这里可以看出Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);内部默认创建了一个Cookie。
继续看
- public SimpleCookie(String name) {
- this();
- this.name = name;
- }
而ShiroHttpSession.DEFAULT_SESSION_ID_NAME="JSESSIONID";
问题来了--》Session失效问题这里为什么为导致Session失效呢?
因为与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID, 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失效。
因此这里需要自己配置Cookie
- <!-- shiro会话管理 -->
- <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 -->
- <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
- <property name="cacheManager" ref="redisCacheManager"/>
- <property name="sessionDAO" ref="redisSessionDAO"/>
- <property name="sessionIdCookie" ref="simpleCookie"/>
- <!-- 全局的会话信息时间,,单位为毫秒 -->
- <property name="globalSessionTimeout" value="1800000"/>
- <!-- 检测扫描信息时间间隔,单位为毫秒-->
- <property name="sessionValidationInterval" value="60000"/>
- <!-- 是否开启扫描 -->
- <property name="sessionValidationSchedulerEnabled" value="false"/>
- <!-- 去掉URL中的JSESSIONID -->
- <property name="sessionIdUrlRewritingEnabled" value="true"/>
- </bean>
- <!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID -->
- <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
- <!-- 设置Cookie名字, 默认为: JSESSIONID 问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID,
- 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! -->
- <property name="name" value="SHIRO-COOKIE"/>
- <!-- JSESSIONID的path为/用于多个系统共享JSESSIONID -->
- <!-- <property name="path" value="/"/> -->
- <!-- 浏览器中通过document.cookie可以获取cookie属性,设置了HttpOnly=true,在脚本中就不能的到cookie,可以避免cookie被盗用 -->
- <property name="httpOnly" value="true"/>
- </bean>
好了,这里Shiro配置Cookie就完成了。
此外,如果要配置多个系统共享Session,放开Cookie中的注释即可。
- <!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID -->
- <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
- <!-- 设置Cookie名字, 默认为: JSESSIONID 问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID,
- 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! -->
- <property name="name" value="SHIRO_COOKIE"/>
- <!-- JSESSIONID的path为/用于多个系统共享JSESSIONID -->
- <property name="path" value="/"/>
- <!-- 浏览器中通过document.cookie可以获取cookie属性,设置了HttpOnly=true,在脚本中就不能的到cookie,可以避免cookie被盗用 -->
- <property name="httpOnly" value="true"/>
- </bean>
这样多个系统就能共享Session了。
Shiro配置cookie以及共享Session和Session失效问题的更多相关文章
- Apache shiro集群实现 (六)分布式集群系统下的高可用session解决方案---Session共享
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- 分布式系统登录功能拦截器的实现以及cookie的共享问题(利用cookie实现session在分布式系统的共享)
当我们的网站采用分布式部署系统时,每个子系统拥有自己独立的session,如果不实现session共享,当用户切换系统访问的时候,会不停的提示登录,这对于用户体验是非常不好的.因此对于多个子系统的的访 ...
- SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录
作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shir ...
- Spring Session实现Session共享下的坑与建议
相信用过spring-session做session共享的朋友都很喜欢它的精巧易用-不依赖具体web容器.不需要修改已成项目的代码.笔者在使用spring-session的过程中也对spring-se ...
- Spring Session解决Session共享
1. 分布式Session共享 在分布式集群部署环境下,使用Session存储用户信息,往往出现Session不能共享问题. 例如:服务集群部署后,分为服务A和服务B,当用户登录时负载到服务A ...
- 【转】Session ID/session token 及和cookie区别
Session + Cookie 知识收集! cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决 ...
- Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...
- [转载]利用memcached在多台服务器之间共享PHP的session数据
原文地址:利用memcached在多台服务器之间共享PHP的session数据作者:a1049709658 最近我的几篇文章都是是最近项目的一点心得^^ 这个项目一开始就设计的"很大&quo ...
- 状态管理之cookie使用及其限制、session会话
# 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.(cookie浏览器所涉及到的访问数据保存下来)# 2.如何进行状态管理? ...
随机推荐
- JavaScript:逻辑操作符“==”与“===”的区别
Summary JavaScript中,逻辑操作符“===”会先检查操作数的数据类型,对不同的数据类型会返回false. 而“==”对不同类型的操作数进行比较时,会进行类型转换后再比较. Descri ...
- WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)
WPF 自定义窗口样式有多种方式,不过基本核心实现都是在修改 Win32 窗口样式.然而,Windows 上的应用就应该有 Windows 应用的样子嘛,在保证自定义的同时也能与其他窗口样式保持一致当 ...
- IIS并发瓶颈线程数的限制
.NET线程池最大线程数的限制-记一次IIS并发瓶颈 https://www.cnblogs.com/7rhythm/p/9964543.html .NET ThreadPool 最大线程数的限制 I ...
- python mysql基本操作
1.创建数据库.表添加数据. # -*- coding: utf-8 -*- import MySQLdb.cursors conn =MySQLdb.connect(',charset = 'utf ...
- 【angularJS】Route路由
介绍 AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). ...
- 基于C#的UDP协议的异步实现
一.摘要 总结UDP传输协议的异步实现. 二.实验平台 visual studio 2010 三.实验实例 服务器端代码: using System; using System.Collections ...
- eclipse marketplace网络连接失败的解决方法
2015-12-04 01:12:33 本想在eclipse上安装一个插件,点进help-EclipseMarketplace却连接失败,错误如下: 在help-instal new software ...
- Docker生态不会重蹈Hadoop的覆辙
本文原作者是晏东(精灵云Ghostcould创始人),在读到<Docker生态会重蹈Hadoop的覆辙吗?>文章后的个人思考,里面的不少观点也是很不错的. 1.形态上的差异 2013年的时 ...
- ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程
1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...
- MySQL主从报错解决:Failed to initialize the master info structure
大清早收到一个MySQL的自定义语言告警 :replication interrupt,看来是主从同步报错了. 登陆MySQL,执行 show slave status \G 发现salve已经停止了 ...