這幾天為了測試人員測試,就把一個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。
這里給看下百度的明顯和其他的不一樣用的是(baiduid作為key):

~完~