瘋狂

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

          jsessionid 問題分析

          Posted on 2011-09-02 16:33 瘋狂 閱讀(19320) 評(píng)論(2)  編輯  收藏 所屬分類: webapache項(xiàng)目方法論架構(gòu)

          這幾天為了測(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è)sessionid和驗(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ù)器生成的sessionid0000yLsny8JFy4nLxDelrrq9Lx1,應(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)下面只存了一份名為JSESSIONIDcookie值,結(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為/ 如圖:

          這個(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):

           

           

           

          ~~

           

           


          評(píng)論

          # re: jsessionid 問題分析  回復(fù)  更多評(píng)論   

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

          # re: jsessionid 問題分析  回復(fù)  更多評(píng)論   

          2011-09-13 09:33 by @joe
          @DB Compare Tool
          這不是清不清干凈的問題吧
          主站蜘蛛池模板: 精河县| 泰和县| 永福县| 万州区| 连云港市| 焉耆| 永兴县| 阳曲县| 囊谦县| 玉屏| 金门县| 邹城市| 峡江县| 肥西县| 周至县| 隆昌县| 得荣县| 蓬溪县| 田阳县| 井研县| 泗水县| 扎兰屯市| 朔州市| 阿合奇县| 沭阳县| 镇沅| 宕昌县| 肇庆市| 集贤县| 楚雄市| 罗山县| 通道| 章丘市| 治多县| 玉环县| 松滋市| 堆龙德庆县| 元氏县| 鲜城| 鄂托克前旗| 丰都县|