天天看點

threadlocal 及session問題

推測是:java代碼部分處理沒處理好(threadlocal 沒remove),一般是不影響,但是再weblogic容器下會有問題。換成tomcat沒問題。

模拟情況1:

電腦 1  使用者a 登入報價

電腦2  使用者b登入報價  背景使用者c登入同一個浏覽器檢視。

電腦1 使用者a報價  使用者b顯示的資訊變成使用者a

模拟情況2:

電腦 1  使用者a 登入報價

電腦2  使用者b登入報價 

電腦1 使用者a在同一浏覽器中打開另外一個單點登入的應用後,回到報價頁面點重新整理按鈕報價資料(不是重新整理頁面),頁面資料變為使用者b的資訊。

重新整理按鈕背景調用的是threadlocal.get使用者。

推測:系統沒有調用threadlocal.remove ,而weblogic對這塊有處理優化,可能是導緻串使用者的原因

調試發現,tomcat沒這個問題,weblogic有這個問題。

weblogic下,idea調試 thealocal get方法(第一次通路系統,不需要上面那種操作),發現變量好像串了,t是null,下面的map反而是t。很奇怪,如圖:

threadlocal 及session問題

但是tomcat下就不會串。正常的

另外按照上面會出現錯誤的流程來,會發現,thread 會來回變,有時候是正确的,有時候是錯誤的。可能因為是null的緣故?

如果真的是null,那麼擷取到有問題也是正常,因為是通過map來擷取嘛。

參考:https://www.cnblogs.com/xubiao/p/5462170.html

後面發現除了這個問題,還是有session沖突的問題

  當使用者使用浏覽器通路web服務時,web服務會查找記憶體中是否有對應的session對象,如果有,則通過session id可以找到,如果沒有,則web服務會為浏覽器建立一個session對象,并生成session id。session id會傳回到浏覽器上使用cookie儲存起來,浏覽器下次請求的時候把該cookie帶上則可以被web服務識别了。

如果一個新的cookie與一個已存在的cookie的NAME、Domain和Path屬性值均相同,則舊的cookie會被丢棄

上面的問題還有一個問題就是後面另外一個系統登入後,前一個系統單點登入擷取到的是null,兩個網站用的是同一個單點登入,但是按照session沖突的方法改了後,這個問題也不存在了,可能也是因為session的問題吧。

總的來說處理了兩個地方:

threadlocal.set之前,remove掉。(threadlocal問題)

每個網站加上唯一的cookiename,區分開來(session沖突問題)

參考:http://www.cnblogs.com/guanjianzhuo/p/9488068.html

參考:https://bijian1013.iteye.com/blog/2277538

繼續閱讀