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

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


    
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <property name="cacheManager" ref="redisCacheManager"/>
        <property name="sessionDAO" ref="redisSessionDAO"/>

        
        <property name="globalSessionTimeout" value="1800000"/>
        
        <property name="sessionValidationInterval" value="60000"/>
        
        <property name="sessionValidationSchedulerEnabled" value="false"/>
        
        <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



<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"/>
    
    <property name="sessionIdUrlRewritingEnabled" value="true"/>
bean>


<bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
      
    <property name="name" value="SHIRO-COOKIE"/>
    
    
    
    <property name="httpOnly" value="true"/>
bean>

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

 

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

    
    <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
          
        <property name="name" value="SHIRO_COOKIE"/>
        
        <property name="path" value="/"/>
        
        <property name="httpOnly" value="true"/>
    bean>

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

 

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

你可能感兴趣的:(java)