瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          jsessionid 問題分析

          Posted on 2011-09-02 16:33 瘋狂 閱讀(19312) 評論(2)  編輯  收藏 所屬分類: webapache項目方法論架構

          這幾天為了測試人員測試,就把一個tomcat應用整個拷貝了一份,改了下端口一個8080,一個8081,上下文也一樣,結果出問題了:頁面登陸驗證碼死活驗證不過去,最后跟蹤了下后臺發現,登陸界面請求時生成驗證碼并將驗證碼放入session里面,這個sessionid和驗證時從獲取驗證碼的session的的id不一樣,那驗證的時候由于session不一樣,獲取驗證碼肯定為空,最終驗證失敗。

           

          根據一般的流程,瀏覽器首次發出請求的時候服務端會在response信息里面給出:

          Set-Cookie: JSESSIONID=0000yLsny8JFy4nLxDelrrq9Lx1:-1; Path=/test (這里假設服務器生成的sessionid0000yLsny8JFy4nLxDelrrq9Lx1,應用上下文為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)下面只存了一份名為JSESSIONIDcookie值,結果導致互相影響。
           
           

          現在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):

           

           

           

          ~~

           

           


          評論

          # re: jsessionid 問題分析  回復  更多評論   

          2011-09-11 21:09 by DB Compare Tool
          拷貝tomcat當然也要清干凈啊

          # re: jsessionid 問題分析  回復  更多評論   

          2011-09-13 09:33 by @joe
          @DB Compare Tool
          這不是清不清干凈的問題吧
          主站蜘蛛池模板: 郧西县| 博客| 威海市| 溧阳市| 呈贡县| 铅山县| 时尚| 馆陶县| 新宁县| 来宾市| 富宁县| 西乡县| 安宁市| 浪卡子县| 隆化县| 克什克腾旗| 蛟河市| 庐江县| 嘉荫县| 吴桥县| 大关县| 卫辉市| 汾阳市| 彭水| 金秀| 汉川市| 通榆县| 噶尔县| 望奎县| 泾川县| 黔江区| 屯留县| 洛阳市| 曲水县| 凤山市| 高平市| 珲春市| 南昌市| 清流县| 徐汇区| 广德县|