這幾天為了測(cè)試人員測(cè)試,就把一個(gè)tomcat應(yīng)用整個(gè)拷貝了一份,改了下端口一個(gè)8080,一個(gè)8081,上下文也一樣,結(jié)果出問題了:頁(yè)面登陸驗(yàn)證碼死活驗(yàn)證不過去,最后跟蹤了下后臺(tái)發(fā)現(xiàn),登陸界面請(qǐng)求時(shí)生成驗(yàn)證碼并將驗(yàn)證碼放入session里面,這個(gè)session的id和驗(yàn)證時(shí)從獲取驗(yàn)證碼的session的的id不一樣,那驗(yàn)證的時(shí)候由于session不一樣,獲取驗(yàn)證碼肯定為空,最終驗(yàn)證失敗。
根據(jù)一般的流程,瀏覽器首次發(fā)出請(qǐng)求的時(shí)候服務(wù)端會(huì)在response信息里面給出:
Set-Cookie: JSESSIONID=0000yLsny8JFy4nLxDelrrq9Lx1:-1; Path=/test (這里假設(shè)服務(wù)器生成的sessionid為0000yLsny8JFy4nLxDelrrq9Lx1,應(yīng)用上下文為test)要求瀏覽器設(shè)置瀏覽器會(huì)話cookie,下次請(qǐng)求的時(shí)候在request頭信息里面附帶:
Cookie: JSESSIONID=0000yLsny8JFy4nLxDelrrq9Lx1:-1 服務(wù)器以此來判斷是否統(tǒng)一客戶端發(fā)出的請(qǐng)求。
而跟蹤我們的應(yīng)用發(fā)現(xiàn)第一次瀏覽器發(fā)出請(qǐng)求后,服務(wù)端response信息為:
Set-CookieJSESSIONID=C7A2EB23B029226E6279448D1CFD6207; Path=/test
第二次發(fā)出請(qǐng)求的時(shí)候整個(gè)會(huì)話信息為:
響應(yīng)頭信息原始頭信息:
Set-Cookie: JSESSIONID=AD54301B809A7D7BBF909F10B4C838AA
; Path=/test
請(qǐng)求頭信息原始頭信息:
Cookie JSESSIONID=4DF629829C6E18953117AB66777ED2CA
瀏覽器雖然第二次請(qǐng)求帶過去的JSESSIONID并不是第一次設(shè)置(C7A2EB23B029226E6279448D1CFD6207
),并且服務(wù)端又發(fā)出了新的Set-Cookie命令和JSESSIONID。
最終才想起還有另一個(gè)tomcat應(yīng)用的copy修改了本次的cookie session 里面的JSESSIONID值,
正好跟蹤到信息為:
Set-Cookie JSESSIONID=4DF629829C6E18953117AB66777ED2CA; Path=/test (這一次請(qǐng)求影響)
Cookie JSESSIONID=C7A2EB23B029226E6279448D1CFD6207(原應(yīng)用的JSESSIONID)
通過查看火狐瀏覽器里面兩個(gè)應(yīng)用在同一個(gè)主機(jī)(localhost)下面只存了一份名為JSESSIONID的cookie值,結(jié)果導(dǎo)致互相影響。


現(xiàn)在tomcat下的一個(gè)辦法就是兩個(gè)應(yīng)用其中一個(gè)修改下上下文,例如一個(gè)是test,另一個(gè)是test1 ,這樣由于cookie的路徑(path)在同一個(gè)級(jí)別下名稱不一樣將不會(huì)互相影響。
瀏覽器判斷cookie的應(yīng)該根據(jù)主機(jī),路徑,名稱來判斷,通常根據(jù)目錄層級(jí)不同作用域也不同,例如:
比如瀏覽器現(xiàn)有三個(gè)cookie, path分別為 "/", "/test", "/test/mgr"
則請(qǐng)求 "/test/other/action.do"時(shí),第1個(gè)cookie和第2個(gè)cookie會(huì)被發(fā)給服務(wù)端,第三個(gè)不會(huì)。
此時(shí)瀏覽器請(qǐng)求頭信息里面的session有可能為多個(gè),但名稱都一樣如:
Cookie: JSESSIONID=8810E51861891187708C53A1805951A1;JSESSIONID=0000yLsny8JFy4nLxDelrrq9Lx1:-1
這個(gè)時(shí)候也是出現(xiàn)問題的時(shí)候,服務(wù)器有可能出現(xiàn)jsessionid不一致的情況,
一個(gè)明顯的問題在websphere下由于默認(rèn)的cookie session的path為/ 如圖:
計(jì)cookie.png)
這個(gè)時(shí)候如果同一臺(tái)主機(jī)或者ip下部署其他應(yīng)用,如果都是用JSESSIONID作為key的話,由于/的作用域大,其他的應(yīng)用將受到影響,首先websphere自己會(huì)受到影響,經(jīng)過測(cè)試websphere的每一次請(qǐng)求如下:
Set-Cookie: JSESSIONID=0000yLsny8JFy4nLxDelrrq9Lx1:-1; Path=/
然后后面多次出現(xiàn)信息如下:
相應(yīng)
Set-Cookie: JSESSIONID= 0000IsxSqg75ELW4C0Y3YCaRgab
:-1; Path=/
請(qǐng)求
Cookie:
JSESSIONID=8810E51861891187708C53A1805951A1(這個(gè)為tomcat的);JSESSIONID=0000yLsny8JFy4nLxDelrrq9Lx1:-1
遇到這種異常情況,請(qǐng)大家從cookie的domain,path,作用域的知識(shí)分析下,然后就應(yīng)該能解決這些問題了,適當(dāng)?shù)男薷南耤ookie的key名稱,和path。
這里給看下百度的明顯和其他的不一樣用的是(baiduid作為key):

~完~