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了。

 

转载于:https://www.cnblogs.com/onlymate/p/9151010.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro-Redis 是一个用于在 Shiro 中实现 Session 共享的插件,它使用 Redis 作为数据存储和缓存,以实现分布式环境下的 Session 共享。 要实现 Shiro-Redis 的 Session 共享,你需要进行以下步骤: 1. 引入 Shiro-Redis 插件依赖:在项目的 Maven 或 Gradle 配置文件中添加 Shiro-Redis 依赖。 2. 配置 Redis 连接信息:在项目的配置文件中配置 Redis 的连接信息,包括主机名、端口号、密码等。 3. 配置 RedisSessionDAO:在 Shiro配置文件中配置 RedisSessionDAO,指定使用 Redis 作为 Session 存储和缓存的实现。可以设置过期时间、前缀等参数。 4. 配置 Session Manager:在 Shiro配置文件中配置 Session Manager,指定使用自定义的 RedisSessionManager 作为 Session 的管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。 5. 配置 SecurityManager:在 Shiro配置文件中配置 SecurityManager,指定使用自定义的 RedisSessionManager 作为 Session 管理器。同时,需要将之前配置的 RedisSessionDAO 设置给 RedisSessionManager。 6. 配置 Filter Chain:在 Shiro配置文件中配置 Filter Chain,将自定义的 RedisSessionManager 添加到 Filter Chain 中,以便对请求进行 Session 管理。 通过以上步骤配置完成后,Shiro 将会使用 Redis 进行 Session 的存储和缓存,从而实现 Session共享。在分布式环境中,不同应用节点之间可以通过 Redis 共享 Session 数据,从而实现用户的登录状态和会话信息的共享
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值