<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sky's blog

    我和我追逐的夢(mèng)

    常用鏈接

    統(tǒng)計(jì)

    其他鏈接

    友情鏈接

    最新評(píng)論

    resin的session id reuse特性(1)--發(fā)現(xiàn)問(wèn)題

        近期因工作需求探索apache + resin的多機(jī)負(fù)載分布和多個(gè)webapp統(tǒng)一認(rèn)證的實(shí)現(xiàn)方案, 期間設(shè)計(jì)多個(gè)webapp統(tǒng)一認(rèn)證的實(shí)現(xiàn)方案時(shí), 發(fā)現(xiàn)resin下通過(guò)cookie來(lái)傳遞jsessionid和通過(guò)url重寫將jsessionid放url中傳遞, 會(huì)有細(xì)微的差異.

        注:后來(lái)研究發(fā)現(xiàn)是resin提供的session id reuse特性,只是此文第一次發(fā)布時(shí)我還不知道有此特性,慚愧。

    在servlet規(guī)范中,HttpServletSession的獲取時(shí)通過(guò)調(diào)用request.getSession(boolean createnew)方法來(lái)實(shí)現(xiàn),其實(shí)現(xiàn)機(jī)制可以簡(jiǎn)單的理解為: 存在一個(gè)大的hashMap結(jié)構(gòu),key就是jsessionid,而valule是HttpservletSession對(duì)象。request.getSession(boolean createnew)方法通過(guò)jsessionid來(lái)獲取對(duì)應(yīng)的HttpservletSession,如果不存在并且參數(shù)createnew=true,則創(chuàng)建一個(gè)新的HttpservletSession對(duì)象,并設(shè)置jsessionid=session.getId() ,保存到hashMap結(jié)構(gòu)中。以后再傳遞這個(gè)jsessionid. (詳細(xì)的過(guò)程比較復(fù)雜,各家的實(shí)現(xiàn)也不盡相同,但大體的實(shí)現(xiàn)原理是如此。)

    關(guān)注以下幾點(diǎn):
    一). 獲取jsessionid
        jsessionid的傳遞可以是以下途徑
        1. 放在cookie中
            Cookie: JSESSIONID=abcrmF3Gx-5Z-hhkgHfzr

        2. 以參數(shù)形式放在url
            http://10.3.2.35:11280/wmail/welcome.action?jsessionid=abcQNqiT4C01rg-necLBr

        3. 用form表單傳遞,通常是用隱藏域
            <input type="hidden" name="jsessionid" value="abcQNqiT4C01rg-necLBr"/>

        4. url重寫
            http://10.3.2.35:11280/jid=abcQNqiT4C01rg-necLBr/wmail/welcome.action
               或者
            http://10.3.2.35:11280/wmail/welcome.action;jsessionid=abcQNqiT4C01rg-necLBr

        如果當(dāng)前還沒(méi)有jsessionid則當(dāng)然就無(wú)法獲取,通常用戶第一次訪問(wèn)或者登錄前就是這種情況.
       
        可以通過(guò)request.getRequestedSessionId() 方法來(lái)獲取本次http 請(qǐng)求的jsessonid值。

    二)獲取到的HttpServletSession對(duì)象

        如果HttpServletSession對(duì)象是已經(jīng)存在的,則
        1. session.isNew()=false
        2. request.getRequestedSessionId() == jsessionid == session.getId()

        如果HttpServletSession對(duì)象是調(diào)用request.getSession(true) (簡(jiǎn)寫的request.getSession()方法等同于request.getSession(true) )時(shí)新創(chuàng)建的,則有以下特征:
        1. session.isNew()=true
        2. 以后傳遞的jsessionid=session.getId()
            注意這里,如果request.getRequestedSessionId() 是空值,情況比較簡(jiǎn)單,以后傳遞jsessionid=session.getId()就是了。
            但是如果request.getRequestedSessionId() 不是空值,通過(guò)這個(gè)值沒(méi)有獲取到已經(jīng)存在的session對(duì)象,而是返回了一個(gè)新的session對(duì)象,這個(gè)時(shí)候新的session.getId()和原有的request.getRequestedSessionId() 關(guān)系如何呢?下面詳細(xì)闡述這種情況。
       

    三) request.getRequestedSessionId() 不是空值時(shí),新的session.getId() = ?


        1). 測(cè)試代碼如下:
        HttpServletRequest request = ServletActionContext.getRequest();
        String jid1 = request.getRequestedSessionId();
        HttpSession session = request.getSession(true);
        String jid2 = request.getRequestedSessionId();

        logger.info("get HttpSession , isNew()=" + session.isNew()
                        + " getId()=" + session.getId()
                        + " and jid1=" + jid1
                        + " and jid2=" + jid2);

        其中jid1和jid2分別是調(diào)用request.getSession(true)方法前后的request.getRequestedSessionId()值。

        在resin中運(yùn)行以上代碼,測(cè)試request.getRequestedSessionId() 不是空值而對(duì)應(yīng)jsessionid的session不存在的情況。
       
        2). 通過(guò)cookie來(lái)傳遞jsessionid的情況,測(cè)試結(jié)果如下:

            get HttpSession, isNew()=true getId()=abcqIgQroQ2Ov9lGYcYAr and jid1=abcqIgQroQ2Ov9lGYcYAr and jid2=abcqIgQroQ2Ov9lGYcYAr

            get HttpSession, isNew()=true getId()=abcPQ3mpxKz8H-4UMdYAr and jid1=abcPQ3mpxKz8H-4UMdYAr and jid2=abcPQ3mpxKz8H-4UMdYAr

            get HttpSession, isNew()=true getId()=abcdeE3iDy_bI536tLYAr and jid1=abcdeE3iDy_bI536tLYAr and jid2=abcdeE3iDy_bI536tLYAr

            可以發(fā)現(xiàn)以下規(guī)律:
            1.  isNew()=true
            2. session.getId() == jid1 == jid2
                即新創(chuàng)建的session會(huì)使用傳遞過(guò)來(lái)的jsessionid值,即使這個(gè)jsessionid值根本沒(méi)有對(duì)應(yīng)的session存在

        3)  通過(guò)url重寫,將jsessionid放url中傳遞, 測(cè)試結(jié)果如下:

            get HttpSession, isNew()=true getId()=abccw1zEC_RcN43qHMYAr and jid1=abcdUdTfKuLbge8h_LYAr and jid2=abcdUdTfKuLbge8h_LYAr
            http://10.3.2.35:11280/jid=abccw1zEC_RcN43qHMYAr/uab/contactList.action

            get HttpSession, isNew()=true getId()=abcFK7yOB1irgaYqgNYAr and jid1=abci-HpMPJU3egCB7MYAr and jid2=abci-HpMPJU3egCB7MYAr
            http://10.3.2.35:11280/jid=abcFK7yOB1irgaYqgNYAr/uab/contactList.action

            (后面的http地址為頁(yè)面跳轉(zhuǎn)完成后顯示在瀏覽器地址框中的頁(yè)面url)
           
            可以發(fā)現(xiàn)以下規(guī)律:
            1. isNew()=true
            2. jid1 == jid2
                request.getRequestedSessionId()值在request.getSession(true)方法調(diào)用前后無(wú)變化
            3. session.getId()  != jid1
                即新創(chuàng)建的session不使用傳遞過(guò)來(lái)的jsessionid值,而是采用新值
            4. 跳轉(zhuǎn)完成后的http地址中,使用的是session.getId(), 而不是原來(lái)通過(guò)url重寫傳遞過(guò)來(lái)的jsessionid
                此時(shí)新的jsessionid覆蓋了舊有的jsessionid.

        4) 總結(jié)
            在resin的實(shí)現(xiàn)中, 通過(guò)cookie來(lái)傳遞jsessionid的情況和通過(guò)url重寫將jsessionid放url中傳遞, 會(huì)有細(xì)微的差異.
            以上測(cè)試的resin版本為3.0.26, 稍后有時(shí)間考慮測(cè)試其他版本和tomcat.

       
            這個(gè)差異直接影響到跨webapp的多個(gè)webapp直接相互傳遞jsessionid的方式, 通過(guò)cookie傳遞jsessionid可以做到多個(gè)webapp之間在頁(yè)面跳轉(zhuǎn)時(shí)始終是一個(gè)相同的jsessionid,這種各個(gè)應(yīng)用都可以方便的獲取到自己的HttpServletSession對(duì)象. 但是如果是通過(guò)url重寫,則破壞了jsessonid的一致性, 逼迫各個(gè)webapp之間跳轉(zhuǎn)時(shí)必須用其他額外的方法來(lái)保證傳遞給對(duì)方的jsessionid的準(zhǔn)確性,因?yàn)榇藭r(shí)每個(gè)webapp的jsessionid都不一樣了,必須記住其他每個(gè)webapp的jsessionid,造成跨webapp的頁(yè)面跳轉(zhuǎn)極其復(fù)雜,難于接受.

    posted on 2007-12-17 10:52 sky ao 閱讀(3448) 評(píng)論(3)  編輯  收藏 所屬分類: web

    評(píng)論

    # re: resin的session id reuse特性(1)--發(fā)現(xiàn)問(wèn)題 2008-01-02 14:35 laohuidi

    good  回復(fù)  更多評(píng)論   

    # re: resin的session id reuse特性(1)--發(fā)現(xiàn)問(wèn)題[未登錄](méi) 2011-04-08 15:42 楊洋

    謝謝你的教導(dǎo)!!受益頗多!!!  回復(fù)  更多評(píng)論   

    # re: resin的session id reuse特性(1)--發(fā)現(xiàn)問(wèn)題[未登錄](méi) 2011-04-08 15:43 楊洋

    收益頗多  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 无码 免费 国产在线观看91| 又粗又硬免费毛片| 中文字字幕在线高清免费电影| ASS亚洲熟妇毛茸茸PICS| 日本亚洲成高清一区二区三区 | 亚洲午夜久久影院| 亚洲五月午夜免费在线视频| 成人免费无码大片a毛片| 91福利视频免费| 暖暖免费在线中文日本| 一区视频免费观看| 无人视频免费观看免费视频| 久久夜色精品国产噜噜亚洲a| 亚洲视频在线观看视频| 亚洲av无码av制服另类专区| 一本色道久久综合亚洲精品| 亚洲国产精品无码久久青草 | 亚洲人成在线播放| 国产成人精品日本亚洲| 亚洲精品无码久久久影院相关影片| 亚洲国产精品无码久久久久久曰| 最新69国产成人精品免费视频动漫 | 中国毛片免费观看| 中文毛片无遮挡高清免费| 午夜成人无码福利免费视频| 免费观看亚洲人成网站| 国产午夜亚洲精品不卡免下载| 亚洲AV一区二区三区四区| 亚洲精华国产精华精华液网站| 亚洲色偷偷综合亚洲AV伊人蜜桃 | 九九免费久久这里有精品23| 色多多A级毛片免费看| 日本一区二区三区免费高清在线| 老妇激情毛片免费| 色老头综合免费视频| 精品久久久久久国产免费了 | 亚洲视频日韩视频| 亚洲最大的黄色网| 亚洲av中文无码乱人伦在线观看| 亚洲精品乱码久久久久久V| 亚洲中文字幕无码爆乳|