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

Stella981
• 阅读 810

首先我们看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了。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
喷火龙 喷火龙
3年前
cookie和session的详解与区别
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。1.1 C
Stella981 Stella981
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Spring Shiro 使用默认的Session会话管理
项目中用到了shirosession会话管理机制,今天来总结一下,以下都是在springboot框架实现。shiro的session管理机制很完善,也是独立于j2ee容器且不依赖的,所以我们完全可以使用shiro提供给我们的session会话管理来实现我们的业务逻辑,默认提供的sessionDAO是memorySessionDAO,这里也主要讲它的配
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这