1. 程式人生 > >遇到問題----shrio------shiro登入,多個專案session被覆蓋問題---兩個web專案會導致shiro的session汙染

遇到問題----shrio------shiro登入,多個專案session被覆蓋問題---兩個web專案會導致shiro的session汙染

情況

遇到問題----shrio------shiro登入,多個專案session被覆蓋問題---一個專案兩個web模組會導致shiro的session汙染

表現為 我在同一臺機子上部署了兩個都使用了shiro管理的web專案。

它們的訪問路徑除了埠不一樣,ip是一樣的。

當兩個系統同時訪問時,在一個系統中操作之後另一個系統就會自動退出登入。

但是 如果用域名訪問就不會出現這個問題。

原因

web專案的session管理  cookie的名稱衝突,兩個web專案用了同樣的cookie名一樣導致的。

解決方法

修改設定cookie名稱即可。

這個根據我們自己對專案的瞭解 cookie是在哪個地方設定的名稱,一般有幾個地方。

web.xml

一個是web.xml中

<session-config>
<cookie-config>
<name>_crmid</name>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>

name這裡設定成不一樣的即可。

shiro.xml

shiro中可以設定sessionIdCookie.name

 <!-- 會話Cookie模板 -->
    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="sid"/>
        **<!--設定Cookie名字,預設為JSESSIONID-->
        <property name="name" value="WEBSID" />**
    </bean>

2個web模組,分別設定不同的sessionIdCookie的name即可。

還有另外一種是這樣設定

 <bean id="shiroSessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">  
<property name="sessionDAO" ref="sessionDAO"/>  
<property name="sessionValidationInterval" value="1800000"/>  <!-- 相隔多久檢查一次session的有效性 -->  
<property name="globalSessionTimeout" value="1800000"/>  <!-- session 有效時間為半小時 (毫秒單位)-->  
<property name="sessionIdCookie.domain" value=".xxx.com"/>  
<property name="sessionIdCookie.name" value="jsid"/>  
<property name="sessionIdCookie.path" value="/"/>  


 <!-- 會話DAO -->
    <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
        <!-- 設定Session快取名字,預設就是shiro-activeSessionCache,要和ehcache.xml中的那麼對應 -->
        <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
        <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
    </bean>


<!-- 會話ID生成器,用於生成會話ID,預設就是JavaUuidSessionIdGenerator,使用java.util.UUID生成-->
    <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>

tomcat

最後tomcat的設定也有可能

tomcat下的server.xml中新增sessionCookieName,A專案設定為A_SESSION,B專案設定為B_SESSION。

<Context path="" docBase="webapp" debug="0" reloadable="false" sessionCookiePath="/" sessionCookieName="A_SESSION"/>