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

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

<!-- 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配置redis

部分源代码apache

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。浏览器

继续看cookie

 

public SimpleCookie(String name) { this(); this.name = name; }

 

而ShiroHttpSession.DEFAULT_SESSION_ID_NAME="JSESSIONID";session


 

问题来了--》Session失效问题这里为何为致使Session失效呢?this

由于与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID, 当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID从新分配值致使登陆会话丢失效。spa


 

所以这里须要本身配置Cookiecode

<!-- 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就完成了。blog

 

此外,若是要配置多个系统共享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了。

相关文章
相关标签/搜索