Shiro配置cookie以及共享Session和Session失效问题

首先我们看Shiro的会话管理器的配置

1<!-- shiro会话管理 --> 2 <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 --> 3 <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 4 <property name="cacheManager" ref="redisCacheManager"/> 5 <property name="sessionDAO" ref="redisSessionDAO"/> 6<!-- <property name="sessionIdCookie" ref="simpleCookie"/> --> 7 <!-- 全局的会话信息时间,,单位为毫秒 --> 8 <property name="globalSessionTimeout" value="1800000"/> 9 <!-- 检测扫描信息时间间隔,单位为毫秒--> 10 <property name="sessionValidationInterval" value="60000"/> 11 <!-- 是否开启扫描 --> 12 <property name="sessionValidationSchedulerEnabled" value="false"/> 13 <!-- 去掉URL中的JSESSIONID --> 14 <property name="sessionIdUrlRewritingEnabled" value="true"/> 15 </bean>

这里是使用DefaultWebSessionManager默认的Cookie配置

部分源代码

1public class DefaultWebSessionManager extends DefaultSessionManager implements WebSessionManager { 2 3 private static final Logger log = LoggerFactory.getLogger(DefaultWebSessionManager.class); 4 5 private Cookie sessionIdCookie; 6 private boolean sessionIdCookieEnabled; 7 private boolean sessionIdUrlRewritingEnabled; 8 9 public DefaultWebSessionManager() { 10 Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME); 11 cookie.setHttpOnly(true); //more secure, protects against XSS attacks 12 this.sessionIdCookie = cookie; 13 this.sessionIdCookieEnabled = true; 14 this.sessionIdUrlRewritingEnabled = true; 15 } 16}

这里可以看出Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);内部默认创建了一个Cookie。

继续看

1public SimpleCookie(String name) { 2 this(); 3 this.name = name; 4 }

而ShiroHttpSession.DEFAULT_SESSION_ID_NAME="JSESSIONID";


问题来了--》Session失效问题这里为什么为导致Session失效呢?

因为与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID, 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失效。


因此这里需要自己配置Cookie

1<!-- shiro会话管理 --> 2<!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 Web 环境的 --> 3<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 4 <property name="cacheManager" ref="redisCacheManager"/> 5 <property name="sessionDAO" ref="redisSessionDAO"/> 6 <property name="sessionIdCookie" ref="simpleCookie"/> 7 <!-- 全局的会话信息时间,,单位为毫秒 --> 8 <property name="globalSessionTimeout" value="1800000"/> 9 <!-- 检测扫描信息时间间隔,单位为毫秒--> 10 <property name="sessionValidationInterval" value="60000"/> 11 <!-- 是否开启扫描 --> 12 <property name="sessionValidationSchedulerEnabled" value="false"/> 13 <!-- 去掉URL中的JSESSIONID --> 14 <property name="sessionIdUrlRewritingEnabled" value="true"/> 15</bean> 16 17<!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID --> 18<bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 19 <!-- 设置Cookie名字, 默认为: JSESSIONID 问题:SERVLET容器名冲突,JETTY, TOMCAT 等默认JSESSIONID, 20 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! --> 21 <property name="name" value="SHIRO-COOKIE"/> 22 <!-- JSESSIONID的path为/用于多个系统共享JSESSIONID --> 23 <!-- <property name="path" value="/"/> --> 24 <!-- 浏览器中通过document.cookie可以获取cookie属性,设置了HttpOnly=true,在脚本中就不能的到cookie,可以避免cookie被盗用 --> 25 <property name="httpOnly" value="true"/> 26</bean>

好了,这里Shiro配置Cookie就完成了。

此外,如果要配置多个系统共享Session,放开Cookie中的注释即可。

1<!-- sessionIdCookie的实现,用于重写覆盖容器默认的JSESSIONID --> 2 <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> 3 <!-- 设置Cookie名字, 默认为: JSESSIONID 问题:SERVLET容器名冲突,JETTY, TOMCAT 等默认JSESSIONID, 4 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失! --> 5 <property name="name" value="SHIRO_COOKIE"/> 6 <!-- JSESSIONID的path为/用于多个系统共享JSESSIONID --> 7 <property name="path" value="/"/> 8 <!-- 浏览器中通过document.cookie可以获取cookie属性,设置了HttpOnly=true,在脚本中就不能的到cookie,可以避免cookie被盗用 --> 9 <property name="httpOnly" value="true"/> 10 </bean>

这样多个系统就能共享Session了。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)

首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模

Shiro配置cookie以及共享Session和Session失效问题 - HelloWorld