tomcat session manger 的session失效問題(雲問科技)


1. 客戶端A訪問A機器, A機器本地隨機產生jsessionid - 目標memcache節點的別名, 如
D206172B7786671E0A6EB71D1F65F15F-n1

2. 此時session實例化, 存入membercached, key爲D206172B7786671E0A6EB71D1F65F15F-n1
              

3. 此時客戶端A訪問B機器, 此時出現兩種情況
Q1. 客戶端A之前有cookie, 且存在jsessionid, 分兩種情況
1. B機器存在該jsessionid對應的session緩存, 直接返回內存中的session
2. B機器沒有該jsessionid對應的session緩存, 或已失效, 向memcache獲取, 可正確獲取, 由sessionManager實現類具體實現的map存儲, 同步反編譯源碼可知
                                
Q2. 客戶端A沒有cookie
B機器寫入jsessionid D206172B7786671E0A6EB71D1F65F15F-n1到客戶端A, 回到Q1情況

4. 問題原因, tomcat session manger接口默認爲粘性session配置
安裝在Tomcat上的MSM使用本機內存保存session,和StandardManager一樣。
另外,當一個請求結束時,session會被送回Memcached進行備份。
當下一次請求開始時,tomcat本地Session可用,直接服務,請求結束後,session又被送回Memcached備份, 這就是導致問題的原因

1. 解決方式1
基於給定策略的路由, 實現同一個jsessionid一定是訪問同一臺tomcat, 那麼粘性session的配置會正確處理session的轉移
啓用粘性session後, 必須指定jvmroute參數來對請求做路由
<Engine defaultHost="localhost" name="Catalina" jvmRoute="tomcat71">
執行流程
1. 客戶端A訪問機器A, 得到jsessionid假設爲 xx-n1:tomcat1
2. 客戶端A訪問機器B, 帶回的jsessionid爲 xx-n1:tomcat1, 與機器B的route不同, 此時機器B從memcache加載session, 並重寫sessionid爲 xx-n1:tomcat2
3. 此時客戶端A重新訪問A, 帶回的jsessionid爲 sessionid爲 xx-n1:tomcat2, 回到2邏輯
                                      

2. 解決方式2
放棄粘性session, sticky="false"
非粘性session將每次從memcache中根據key load最新的session
                           

5. 完整的配置文件
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes= "n1:114.55.66.121:12000"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sticky="false"
sessionBackupTimeout="500"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
copyCollectionsForSerialization="true" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章