亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Session/cookie機制詳解

2024-04-27 15:03:57
字體:
來源:轉載
供稿:網友

#1036869 

六、Httpsession常見問題(在本小節中session的含義為⑤和⑥的混合)     1、session在何時被創建     一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果jsp沒有顯示的使用 <%@page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。     由于session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。     2、session何時被刪除     綜合前面的討論,session在下列情況下被刪除a.程序調用HttpSession.invalidate();或b.距離上一次收到客戶端發送的session id時間間隔超過了session的超時設置;或c.服務器進程被停止(非持久session)     3、如何做到在瀏覽器關閉時刪除session     嚴格的講,做不到這一點??梢宰鲆稽c努力的辦法是在所有的客戶端頁面里使用javascript代碼window.oncolose來監視瀏覽器的關閉動作,然后向服務器發送一個請求來刪除session。但是對于瀏覽器崩潰或者強行殺死進程這些非常規手段仍然無能為力。     4、有個HttpSessionListener是怎么回事     你可以創建這樣的listener去監控session的創建和銷毀事件,使得在發生這樣的事件時你可以做一些相應的工作。注意是session的創建和銷毀動作觸發listener,而不是相反。類似的與HttpSession有關的listener還有HttpSessionBindingListener,HttpSessionActivationListener和HttpSessionAttributeListener。     5、存放在session中的對象必須是可序列化的嗎     不是必需的。要求對象可序列化只是為了session能夠在集群中被復制或者能夠持久保存或者在必要時server能夠暫時把session交換出內存。在Weblogic Server的session中放置一個不可序列化的對象在控制臺上會收到一個警告。我所用過的某個iPlanet版本如果session中有不可序列化的對象,在session銷毀時會有一個Exception,很奇怪。     6、如何才能正確的應付客戶端禁止cookie的可能性     對所有的URL使用URL重寫,包括超鏈接,form的action,和重定向的URL,具體做法參見[6] http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770     7、開兩個瀏覽器窗口訪問應用程序會使用同一個session還是不同的session     參見第三小節對cookie的討論,對session來說是只認id不認人,因此不同的瀏覽器,不同的窗口打開方式以及不同的cookie存儲方式都會對這個問題的答案有影響。     8、如何防止用戶打開兩個瀏覽器窗口操作導致的session混亂     這個問題與防止表單多次提交是類似的,可以通過設置客戶端的令牌來解決。就是在服務器每次生成一個不同的id返回給客戶端,同時保存在session里,客戶端提交表單時必須把這個id也返回服務器,程序首先比較返回的id與保存在session里的值是否一致,如果不一致則說明本次操作已經被提交過了。可以參看《J2EE核心模式》關于表示層模式的部分。需要注意的是對于使用Javascript window.open打開的窗口,一般不設置這個id,或者使用單獨的id,以防主窗口無法操作,建議不要再window.open打開的窗口里做修改操作,這樣就可以不用設置。     9、為什么在Weblogic Server中改變session的值后要重新調用一次session.setValue         做這個動作主要是為了在集群環境中提示Weblogic Server session中的值發生了改變,需要向其他服務器進程復制新的session值。     10、為什么session不見了     排除session正常失效的因素之外,服務器本身的可能性應該是微乎其微的,雖然筆者在iPlanet6SP1加若干補丁的Solaris版本上倒也遇到過;瀏覽器插件的可能性次之,筆者也遇到過3721插件造成的問題;理論上防火墻或者代理服務器在cookie處理上也有可能會出現問題。 出現這一問題的大部分原因都是程序的錯誤,最常見的就是在一個應用程序中去訪問另外一個應用程序。我們在下一節討論這個問題。     七、跨應用程序的session共享     常常有這樣的情況,一個大項目被分割成若干小項目開發,為了能夠互不干擾,要求每個小項目作為一個單獨的web應用程序開發,可是到了最后突然發現某幾個小項目之間需要共享一些信息,或者想使用session來實現SSO(single sign on),在session中保存login的用戶信息,最自然的要求是應用程序間能夠訪問彼此的session。     然而按照Servlet規范,session的作用范圍應該僅僅限于當前應用程序下,不同的應用程序之間是不能夠互相訪問對方的session的。各個應用服務器從實際效果上都遵守了這一規范,但是實現的細節卻可能各有不同,因此解決跨應用程序session共享的方法也各不相同。     首先來看一下Tomcat是如何實現web應用程序之間session的隔離的,從Tomcat設置的cookie路徑來看,它對不同的應用程序設置的cookie路徑是不同的,這樣不同的應用程序所用的session id是不同的,因此即使在同一個瀏覽器窗口里訪問不同的應用程序,發送給服務器的session id也可以是不同的。

 

  根據這個特性,我們可以推測Tomcat中session的內存結構大致如下。

 筆者以前用過的iPlanet也采用的是同樣的方式,估計SunONE與iPlanet之間不會有太大的差別。對于這種方式的服務器,解決的思路很簡單,實際實行起來也不難。要么讓所有的應用程序共享一個session id,要么讓應用程序能夠獲得其他應用程序的session id。     iPlanet中有一種很簡單的方法來實現共享一個session id,那就是把各個應用程序的cookie路徑都設為/(實際上應該是/NASApp,對于應用程序來講它的作用相當于根)。     <session-info>     <path>/NASApp</path>     </session-info>     需要注意的是,操作共享的session應該遵循一些編程約定,比如在session attribute名字的前面加上應用程序的前綴,使得setAttribute("name", "neo")變成setAttribute("app1.name", "neo"),以防止命名空間沖突,導致互相覆蓋。     在Tomcat中則沒有這么方便的選擇。在Tomcat版本3上,我們還可以有一些手段來共享session。對于版本4以上的Tomcat,目前筆者尚未發現簡單的辦法。只能借助于第三方的力量,比如使用文件、數據庫、JMS或者客戶端cookie,URL參數或者隱藏字段等手段。     我們再看一下Weblogic Server是如何處理session的。

 

  從截屏畫面上可以看到Weblogic Server對所有的應用程序設置的cookie的路徑都是/,這是不是意味著在Weblogic Server中默認的就可以共享session了呢?然而一個小實驗即可證明即使不同的應用程序使用的是同一個session,各個應用程序仍然只能訪問自己所設置的那些屬性。這說明Weblogic Server中的session的內存結構可能如下:

   對于這樣一種結構,在session機制本身上來解決session共享的問題應該是不可能的了。除了借助于第三方的力量,比如使用文件、數據庫、JMS或者客戶端cookie,URL參數或者隱藏字段等手段,還有一種較為方便的做法,就是把一個應用程序的session放到ServletContext中,這樣另外一個應用程序就可以從ServletContext中取得前一個應用程序的引用。示例代碼如下, 

    應用程序A :    context.setAttribute("appA", session);     應用程序B :    contextA = context.getContext("/appA");     HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");     值得注意的是這種用法不可移植,因為根據ServletContext的JavaDoc,應用服務器可以處于安全的原因對于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通過。     那么Weblogic Server為什么要把所有的應用程序的cookie路徑都設為/呢?原來是為了SSO,凡是共享這個session的應用程序都可以共享認證的信息。一個簡單的實驗就可以證明這一點,修改首先登錄的那個應用程序的描述符weblogic.xml,把cookie路徑修改為/appA訪問另外一個應用程序會重新要求登錄,即使是反過來,先訪問cookie路徑為/的應用程序,再訪問修改過路徑的這個,雖然不再提示登錄,但是登錄的用戶信息也會丟失。注意做這個實驗時認證方式應該使用FORM,因為瀏覽器和web服務器對basic認證方式有其他的處理方式,第二次請求的認證不是通過session來實現的。具體請參看[7] secion 14.8 Authorization,你可以修改所附的示例程序來做這些試驗。     八、總結     session機制本身并不復雜,然而其實現和配置上的靈活性卻使得具體情況復雜多變。這也要求我們不能把僅僅某一次的經驗或者某一個瀏覽器,服務器的經驗當作普遍適用的經驗,而是始終需要具體情況具體分析。 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久热99视频在线观看| 国产精品pans私拍| 亚洲精品一区二区三区不| 日韩欧美中文字幕在线播放| 亚洲大胆人体av| 狠狠色狠狠色综合日日小说| 久久久久国产一区二区三区| 国产97色在线| 欧美性猛交xxx| 亚洲国产精品va在线| 亚洲国产高清自拍| 一区二区三区美女xx视频| 91中文在线视频| 一区二区成人av| 性欧美长视频免费观看不卡| 中文字幕精品在线| 国产成人中文字幕| 亚洲色图35p| 日韩精品在线免费观看| 日韩美女视频在线观看| 国产精品久久久久久久av大片| 国产一区二区色| 一区二区在线视频播放| 国产丝袜高跟一区| 欧美在线视频免费播放| 欧美成人午夜激情| 日韩成人小视频| 国产在线观看不卡| 久久久久久久国产精品视频| 国产精品久久中文| 欧美高跟鞋交xxxxhd| 国产美女久久精品香蕉69| 日韩精品极品视频| 97精品一区二区视频在线观看| 国产91精品久久久久久| 岛国视频午夜一区免费在线观看| 亚洲第一福利在线观看| 日韩av电影国产| 日韩欧美精品在线观看| 国产一区二区三区在线观看视频| 欧美日韩在线看| 岛国av一区二区| 日韩免费观看在线观看| 欧美日韩另类字幕中文| 国产精品一区二区三区在线播放| 精品亚洲精品福利线在观看| 上原亚衣av一区二区三区| 亚洲乱码一区av黑人高潮| 欧美激情亚洲一区| 精品久久久久久国产| 91网在线免费观看| 国产精品最新在线观看| 91最新在线免费观看| 欧美性xxxx| www.国产精品一二区| 久久91亚洲精品中文字幕| 国产精品视频专区| 中文字幕亚洲一区| 日韩免费在线观看视频| 国内精品久久久久久| 精品成人国产在线观看男人呻吟| 亚洲一区二区三区四区在线播放| 亚洲精品电影网在线观看| 亚洲自拍另类欧美丝袜| 国产精品无码专区在线观看| 美女精品久久久| 国产精品久久久久免费a∨| 国产在线视频欧美| 国产精品久久电影观看| 午夜精品久久久久久久99热浪潮| 97精品一区二区视频在线观看| 91精品国产91久久久久久吃药| 日韩在线播放av| 国产精品99久久久久久www| 亚洲女同精品视频| 一区三区二区视频| 日韩中文在线不卡| 成人欧美在线观看| 精品久久久久久国产| 欧美精品在线网站| 日韩在线中文字| 久久久久久久久久国产| 亚洲精品动漫100p| 欧美性受xxxx白人性爽| 中日韩美女免费视频网址在线观看| 伊人久久免费视频| 亚洲综合精品一区二区| 国产精品久久精品| 欧美刺激性大交免费视频| 中文字幕日韩有码| 成人妇女淫片aaaa视频| www.日本久久久久com.| 国产精品视频一区国模私拍| 亚洲电影av在线| 97在线看福利| 91九色国产社区在线观看| 国产成人精品一区| 国产做受高潮69| 欧美国产日本高清在线| 亚洲韩国青草视频| 国产精品久久久久影院日本| 日韩小视频在线观看| 欧美人与物videos| 中文字幕精品一区久久久久| 欧美电影电视剧在线观看| 91精品啪在线观看麻豆免费| 日本19禁啪啪免费观看www| 久久久精品久久久久| 久久av中文字幕| 欧美激情一区二区久久久| 日产精品99久久久久久| 精品综合久久久久久97| 国产成人在线亚洲欧美| 亚洲天堂av网| 日韩精品极品视频| 久久国产精品99国产精| 国产精品视频播放| 亚洲国产精品成人精品| 国产精品18久久久久久麻辣| 亚洲视频日韩精品| 色综合色综合久久综合频道88| 欧美日韩一区二区三区| 久久久91精品| 欧美精品激情blacked18| 性色av一区二区三区在线观看| 亚洲mm色国产网站| 成人欧美一区二区三区在线| 亚洲人av在线影院| 成人中心免费视频| 亚洲精品美女免费| 日韩在线免费视频| 欧美视频在线观看免费| 国产99久久久欧美黑人| 91高潮精品免费porn| 中文字幕在线看视频国产欧美在线看完整| 欧美日韩国产第一页| 国产成人亚洲综合| 国产免费一区二区三区在线观看| 午夜美女久久久久爽久久| 日韩成人网免费视频| 国产精品视频精品视频| 欧美wwwwww| 日韩少妇与小伙激情| 欧美日本高清视频| 国产亚洲日本欧美韩国| 日韩成人av在线播放| 亚洲午夜色婷婷在线| 国产精品69久久| 久久不射热爱视频精品| 在线播放国产一区中文字幕剧情欧美| 国产精品一区二区三区久久| 国产在线播放不卡| 在线观看日韩视频| 欧美日韩成人在线观看| 国产在线999| 91精品视频网站| 久久精品青青大伊人av| 日韩av免费在线看| 亚洲石原莉奈一区二区在线观看| 最新91在线视频| 欧美日韩中文在线| 欧美激情一区二区久久久| 亚洲国产精彩中文乱码av| 久久精品人人爽|