jsessionid 問題分析
這幾天為了測試人員測試,就把乙個tomcat應用整個拷貝了乙份,改了下埠乙個8080,乙個8081,上下文也一樣,結果出問題了:頁面登陸驗證碼死活驗證不過去,最後跟蹤了下後台發現,登陸介面請求時生成驗證碼並將驗證碼放入session裡面,這個session的id和驗證時從獲取驗證碼的session的的id不一樣,那驗證的時候由於session不一樣,獲取驗證碼肯定為空,最終驗證失敗。
根據一般的流程,瀏覽器首次發出請求的時候服務端會在response資訊裡面給出:
set-cookie: jsessionid=0000ylsny8jfy4nlxdelrrq9lx1:-1; path=/test (這裡假設伺服器生成的sessionid為0000ylsny8jfy4nlxdelrrq9lx1,應用上下文為test)要求瀏覽器設定瀏覽器會話cookie,下次請求的時候在request頭資訊裡面附帶:
cookie: jsessionid=0000ylsny8jfy4nlxdelrrq9lx1:-1 伺服器以此來判斷是否統一客戶端發出的請求。
而跟蹤我們的應用發現第一次瀏覽器發出請求後,服務端response資訊為:
set-cookiejsessionid=c7a2eb23b029226e6279448d1cfd6207; path=/test
第二次發出請求的時候整個會話資訊為:
響應頭資訊原始頭資訊:
set-cookie: jsessionid=ad54301b809a7d7bbf909f10b4c838aa; path=/test
請求頭資訊原始頭資訊:
cookie jsessionid=4df629829c6e18953117ab66777ed2ca
瀏覽器雖然第二次請求帶過去的jsessionid並不是第一次設定(c7a2eb23b029226e6279448d1cfd6207),並且服務端又發出了新的set-cookie命令和jsessionid。
最終才想起還有另乙個tomcat應用的copy修改了本次的cookie session 裡面的jsessionid值,
正好跟蹤到資訊為:
set-cookie jsessionid=4df629829c6e18953117ab66777ed2ca; path=/test (這一次請求影響)
cookie jsessionid=c7a2eb23b029226e6279448d1cfd6207(原應用的jsessionid)
通過檢視火狐瀏覽器裡面兩個應用在同乙個主機(localhost)下面只存了乙份名為jsessionid的cookie值,結果導致互相影響。
現在tomcat下的乙個辦法就是兩個應用其中乙個修改下上下文,例如乙個是test,另乙個是test1 ,這樣由於cookie的路徑(path)在同乙個級別下名稱不一樣將不會互相影響。
瀏覽器判斷cookie的應該根據主機,路徑,名稱來判斷,通常根據目錄層級不同作用域也不同,例如:
比如瀏覽器現有三個cookie, path分別為 "/", "/test", "/test/mgr" 則請求 "/test/other/action.do"時,第1個cookie和第2個cookie會被發給服務端,第三個不會。
此時瀏覽器請求頭資訊裡面的session有可能為多個,但名稱都一樣如:
cookie: jsessionid=8810e51861891187708c53a1805951a1;jsessionid=0000ylsny8jfy4nlxdelrrq9lx1:-1
這個時候也是出現問題的時候,伺服器有可能出現jsessionid不一致的情況,
乙個明顯的問題在websphere下由於預設的cookie session的path為/ 如圖:
這個時候如果同一臺主機或者ip下部署其他應用,如果都是用jsessionid作為key的話,由於/的作用域大,其他的應用將受到影響,首先websphere自己會受到影響,經過測試websphere的每一次請求如下:
set-cookie: jsessionid=0000ylsny8jfy4nlxdelrrq9lx1:-1; path=/
然後後面多次出現資訊如下:
相應set-cookie: jsessionid= 0000isxsqg75elw4c0y3ycargab:-1; path=/
請求cookie:
jsessionid=8810e51861891187708c53a1805951a1(這個為tomcat的);jsessionid=0000ylsny8jfy4nlxdelrrq9lx1:-1
遇到這種異常情況,請大家從cookie的domain,path,作用域的知識分析下,然後就應該能解決這些問題了,適當的修改下cookie的key名稱,和path。
~完~
jsessionid釋疑解惑
session的實現方式 做web開發的同學都知道,http是無狀態的會話協議,也就是說無法儲存使用者的資訊。那如果有一些資訊需要在使用者的瀏覽活動中一直保持,該怎麼做 呢?我們可以把這些資訊在每次請求的時候作為引數傳遞給伺服器,但這樣做既麻煩又耗費資源,這時候就體現出了session的重要性。se...
jsessionid釋疑解惑
session的實現方式 做web開發的同學都知道,http是無狀態的會話協議,也就是說無法儲存使用者的資訊。那如果有一些資訊需要在使用者的瀏覽活動中一直保持,該怎麼做呢?我們可以把這些資訊在每次請求的時候作為引數傳遞給伺服器,但這樣做既麻煩又耗費資源,這時候就體現出了session的重要性。ses...
jsessionid所引起的問題 和解決
jsessionid所引起的問題 在spring mvc當使用redirectview或者 redirect 字首來做重定向時,spring mvc最後會呼叫 response.sendredirect response.encoderedirecturl url 對於ie來說,開啟乙個新的瀏覽器視...