一、背景
最近在整合了Spring+Shiro+Redis實現tomcat叢集session共享的問題之後,釋出以後執行以後發現老是會出現:org.apache.shiro.session.UnknownSessionException: There is no session with id [xxxx]的問題,具體問題如下截圖:
二、出現這個問題的原因
只所以出現這個問題是因為在shiro的DefaultWebSessionManager類中,預設Cookie名稱是JSESSIONID,這樣的話與servlet容器名衝突, 如jetty, tomcat等預設JSESSIONID, 當跳出shiro servlet時如error-page容器會為JSESSIONID重新分配值導致登入會話丟失!
明白了出現這個問題的原因,就好辦了,我們只需要自己指定一個與專案執行容器不衝突的sessionID就好了,具體如下,在spring-shiro.xml中進行如下配置:
<!--sessionManager --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="sessionDAO" ref="redisSessionDAO" /> <property name="sessionIdCookie" ref="simpleCookie"/> </bean> <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg name="name" value="shiro.sesssion"/> <property name="path" value="/"/> </bean>
這樣,我們就很完美的解決了這個問題!至於想知道spring+shiro+redis整合實現tomcat叢集session共享的童鞋,請移步:Shrio+Redis實現tomcat叢集共享session