以我的經驗來看,session這個詞的濫用程度大概僅次於transaction。更有趣的是,事務和會話在某些上下文中具有相同的含義。
Session在中文裏通常被翻譯成conversation,原意是有始有終的壹系列動作/信息。比如打電話時從拿起電話到撥號的過程,可以稱為會話。有時我們會看到“在瀏覽器會話期間,...”這樣的話,這裏的會話壹詞是按其本義使用的,指的是從瀏覽器窗口打開到關閉的這段時間。最容易混淆的是“用戶(客戶端)在對話中”這句話,它可能指的是用戶的壹系列動作(通常是與某個特定目的相關的壹系列動作,比如網購從登錄到購買商品再到結賬的過程,有時稱為交易),但有時它可能只指壹個連接,也可能指的是意義①,區別只能從上下文②中推斷出來。
然而,當會話壹詞與網絡協議聯系在壹起時,它往往意味著兩種含義,即“面向連接”和/或“保持狀態”。“面向連接”是指溝通雙方在溝通前要建立溝通渠道,比如打電話,直到對方接電話。相反,寫信,當妳寄信的時候,妳無法確認對方的地址是否正確,溝通渠道可能無法建立。“保持狀態”意味著通信的壹方可以關聯壹系列消息,以便消息可以相互依賴。例如,服務員可以認出壹位再次光臨的老顧客,並記住該顧客上次欠商店壹美元。這種類型的例子有“TCP會話”或“pop 3會話”。
在web服務器蓬勃發展的時代,web開發上下文中的會話語義有了新的擴展套件,這意味著壹種用於保持客戶端和服務器之間狀態的解決方案。有時候session也用來指代這種解決方案的存儲結構,比如“在session中存儲xxx”。因為各種用於web開發的語言都在壹定程度上提供了對這種解決方案的支持,所以在特定語言的上下文中,session也被用來指代該語言的解決方案。比如javax。小型應用程序...Java中提供的http會話通常簡稱為會話6。
鑒於這種混亂,本文中會話壹詞的使用會根據上下文有不同的含義,請註意區分。
本文用中文“瀏覽器會話”表示意義①,用“會話機制”表示意義④,用“會話”表示意義⑤,用具體的“HttpSession”表示意義⑤。
二、HTTP協議和狀態維護
HTTP協議本身是無狀態的,這與HTTP協議的初衷是壹致的。客戶端只需要簡單地請求服務器下載壹些文件。客戶端和服務器都不需要記錄對方過去的行為,每個請求都是獨立的,就像客戶和自動售貨機或者普通(非會員制)超市的關系壹樣。
但是聰明(還是貪婪?)人們很快發現,如果能提供壹些按需生成的動態信息,網絡就會變得更加有用,就像給有線電視增加點播功能壹樣。這種需求壹方面迫使HTML逐漸增加表單、腳本、DOM等客戶端行為,另壹方面CGI規範出現在服務器端,以響應客戶端的動態請求。HTTP協議作為傳輸載體,還增加了文件上傳、cookie等功能。其中,cookie的作用是努力解決HTTP協議的無狀態缺陷。至於後期的會話機制,在客戶端和服務器端保持狀態是另壹種解決方案。
讓我們用幾個例子來描述壹下cookie和會話機制的區別和聯系。以前去咖啡店喝五杯咖啡,免費送壹杯咖啡。然而,壹次喝完五杯咖啡的幾率很小。這時候就需要某種方式來記錄壹個客戶的消費情況。設想實際上有以下幾種方案:
1.這家商店的店員很能記住每位顧客的消費情況。顧客壹進咖啡店,店員就知道怎麽對待了。這種方法是協議本身支持狀態。
2.送卡給客戶,卡上記錄消費金額,壹般有有效期。每次顧客出示這張卡,消費就會和以前或以後的消費產生關聯。這種方法是在客戶端維護狀態。
3.給客戶壹張會員卡,除了卡號之外不記錄任何信息。如果顧客每次都出示卡片,店員會在店鋪的記錄簿中找到卡號對應的記錄來補充壹些消費信息。這種做法是為了在服務器端保持狀態。
由於HTTP協議是無狀態的,並且出於各種原因不希望有狀態,後兩種方案成為現實的選擇。具體來說,cookie機制采用在客戶端維護狀態的方案,而會話機制采用在服務器端維護狀態的方案。同時我們也看到,由於服務器端的狀態保持方案也需要在客戶端存儲壹個標識符,會話機制可能需要使用cookie機制來達到存儲標識符的目的,但實際上它還有其他選擇。
第三,了解cookie機制
cookie機制的基本原理就像上面的例子壹樣簡單,但是還有幾個問題需要解決:如何分發“會員卡”;"會員卡"的內容;以及客戶如何使用“會員卡”。
正統的cookie分發是通過擴展suite HTTP協議來實現的,服務器通過在HTTP響應頭中增加壹行特殊的指令來提示瀏覽器根據指令生成相應的cookie。但是,純客戶端腳本(如JavaScript或VBScript)也可以生成cookie。
cookie的使用是由瀏覽器在後臺按照壹定的原則自動發送到服務器的。瀏覽器檢查所有存儲的cookies。如果cookie的作用域大於或等於所請求資源的位置,它將被附加到所請求資源的HTTP請求頭中,並上傳到服務器。這意味著麥當勞的會員卡只能在麥當勞門店出示。如果壹家分店已經發了自己的會員卡,那麽進這家店除了要出示麥當勞的會員卡,還要出示這家店的會員卡。
cookie的內容主要包括:名稱、值、過期時間、路徑和域。
其中,域可以指定某個域,比如。谷歌。,相當於總公司的招牌,比如寶潔,也可以指定壹個域下的具體機器,比如google。或者froogle.google,可以和軟度比。
路徑是域名後面的URL路徑,如/或/foo等。,可與軟計數器進行比較。
路徑和域的組合構成了cookie的作用域。
如果未設置過期時間,則意味著該cookie的生存期在瀏覽器會話期間。只要瀏覽器窗口關閉,cookie就會消失。這種生存期為瀏覽器會話的cookie稱為會話cookie。會話cookie壹般不存儲在硬盤上,而是存儲在內存中。當然,規範中並沒有規定這種行為。如果設置了過期時間,瀏覽器會將cookie存儲在硬盤上,關閉再打開瀏覽器,這些cookie會壹直有效,直到設置了過期時間。
存儲在硬盤上的Cookie可以在不同的瀏覽器程序之間共享,比如兩個ie窗口。不同的瀏覽器有不同的方式來處理存儲在內存中的cookie。對於IE來說,在打開的窗口上按Ctrl-N(或者從文件菜單)可以和原窗口共享,而通過其他方式新打開的IE程序不能和內存cookie共享;已經打開的窗口;對於Mozilla Firefox0.8,所有程序和標簽可以* * *享受相同的cookie。壹般來說,用javascript的window.open打開的窗口會和原窗口共享壹個內存cookie。瀏覽器對會話cookies的處理只認cookies不認人,往往給采用會話機制的web應用開發者帶來很大的麻煩。
下面是goolge設置cookie響應頭的壹個例子。
找到HTTP/1.1 302
地點::谷歌。/intl/zh-CN/
set-Cookie:PREF = ID = 0565 f 77 e 132 de 138:NW = 1:TM = 1098082649:LM = 1098082649:S = kaeacfpo 49 RIA _ D8;expires=Sun,17-Jan-2038 19:14:07 GMT;path =/;域名= .谷歌。
內容類型:文本/
這是HTTP嗅探器軟件HTTPLook捕獲的HTTP通信記錄的壹部分。
瀏覽器再次訪問goolge的資源時會自動發送cookie。
使用Firefox,您可以很容易地觀察到現有cookie的價值。
配合Firefox使用HTTPLook可以很容易理解cookie的工作原理。
IE也可以設置為在接受cookie前詢問。
這是壹個要求接受cookie的對話框。
第四,了解會話機制
會話機制是壹種服務器端機制,服務器使用類似哈希表的結構(即可能使用哈希表)來存儲信息。
當壹個程序需要為壹個客戶機的請求建立壹個會話時,服務器首先檢查客戶機的請求是否已經包含壹個會話標識符——稱為會話id。如果它已經包含壹個會話id,則意味著之前已經為該客戶端建立了壹個會話。服務器將根據會話id檢索此會話以供使用(如果無法檢索,可能會創建壹個新的會話)。如果客戶端請求不包含會話id,則將為該客戶端建立會話,並且將生成與該會話相關聯的會話id。session id的值應該是壹個不會重復且不容易被發現被模仿的字符串。此會話id將返回給客戶端,以便在此響應中進行存儲。
Cookie可以用來存儲這個會話id,這樣在交互過程中瀏覽器可以根據規則自動向服務器顯示這個標識符。通常,此cookie的名稱類似於SEEESIONID和。比如weblogic為web應用生成的cookie,jssession id = byok 3 vjfd 75 anpnrf 7 C2 HMD NV 6 qzcebzwienbeierjq 99 zwbwb ng!-145788764,它的名字叫JSESSIONID。
由於cookie可以被人為禁止,所以當cookie被禁止時,必須有其他機制將會話id傳遞回服務器。經常使用的壹種技術叫做URL重寫,即會話id直接附加到URL路徑上,有兩種方式附加。壹種是作為URL路徑的附加信息,形式為:.../XXX;jsessionid = byok3vjfd 75 APN RF 7 C2 hmdnv 6 qzcebzwowibyenlerjq 99 zwpbng!-145788764
另壹個作為查詢字符串附加到URL,表達式為:.../xxx?jsessionid = byok3vjfd 75 APN RF 7 C2 hmdnv 6 qzcebzwowibyenlerjq 99 zwpbng!-145788764
對於用戶來說,這兩種方法沒有區別,只是服務器在解析時對它們的處理不同。采用第壹種方法也有利於區分會話id信息和正常的程序參數。
為了在整個交互過程中保持狀態,這個會話id必須包含在每個客戶端可能請求的路徑之後。
另壹種技術叫做表單隱藏字段。也就是說,服務器將自動修改表單並添加壹個隱藏字段,以便在提交表單時可以將會話id傳遞回服務器。例如,以下形式
& ltform name = test form action = "/XXX " & gt;
& lt輸入類型= text & gt
& lt/form & gt;
將像傳遞給客戶端之前壹樣被重寫。
& ltform name = test form action = "/XXX " & gt;
& ltinput type = hidden name = jsessionid value = " byok 3 vjfd 75 APN RF 7 C2 hmdnv 6 qzcebzwowibyenlerjq 99 zwpbng!-145788764 " >
& lt輸入類型= text & gt
& lt/form & gt;
這種技術現在已經很少使用了,我接觸的很老的IPL A6(Sun One應用服務器的前身)就使用了這種技術。
事實上,這種技術可以簡單地通過將URL重寫應用於動作來替換。
在談到會話機制的時候,經常會聽到壹種誤解“只要關閉瀏覽器,會話就會消失”。其實可以想象會員卡的例子。除非顧客主動到店裏退卡,否則店家絕不會輕易刪除顧客的信息。會話也是如此。除非程序告訴服務器刪除壹個會話,否則服務器會壹直保留它。通常,當用戶註銷時,程序會發送壹個刪除會話的命令。但是瀏覽器在關閉之前從來不會主動通知服務器它將被關閉,所以服務器永遠沒有機會知道瀏覽器被關閉了。產生這種錯覺的原因是大部分會話機制都是使用session cookie來存儲會話id,但是關閉瀏覽器後,這個會話id就消失了,重新連接服務器時就找不到原來的會話了。如果服務器設置的cookie存儲在硬盤上,或者通過某種手段重寫了瀏覽器發送的HTTP請求頭,並將原會話id發送給服務器,那麽再次打開瀏覽器時仍然可以找到原會話。
正是因為關閉瀏覽器不會導致會話被刪除,才迫使服務器為會話設置到期時間。當自客戶端上次使用會話以來的時間超過此過期時間時,服務器可以認為客戶端已停止其活動,並刪除會話以節省存儲空間。
動詞 (verb的縮寫)理解Javax。小型應用程序...HttpSession
HttpSession是Java平臺實現會話機制的規範,因為它只是壹個接口。對於web應用服務器的每個提供者來說,除了對規範的支持之外,還有壹些細微的差別沒有在規範中規定。這裏我們以BEA的Weblogic Server8.1為例來演示。
首先,Weblogic Server提供了壹系列的參數來控制其HttpSession的實現,包括使用cookie的switch選項、使用URL重寫的switch選項、會話持久性的設置、會話過期時間的設置以及對cookie的各種設置,比如設置cookie的名稱、路徑、域、生存期等。
在正常情況下,會話存儲在內存中。當服務器程序停止或重新啟動時,內存中的會話也將被清空。如果設置了會話的持久性特性,服務器會將會話存儲在硬盤上。當服務器程序重新啟動或信息將被重用時,Weblogic Server支持的持久性方法包括文件、數據庫和客戶端cookie存儲和復制。
嚴格來說,復制並不是持久存儲,因為會話實際上是存儲在內存中的,只是將相同的信息復制到每個集群中的服務器進程,這樣即使壹個服務器進程停止工作,它仍然可以從其他進程獲得會話。
cookie生存期的設置會影響瀏覽器生成的cookie是否為會話cookie。默認情況下使用會話cookie。有興趣的可以用它來檢驗我們在第四節提到的誤區。
cookie的路徑對於web應用來說是壹個非常重要的選項,Weblogic Server對該選項的默認處理方式使其明顯區別於其他服務器。我們以後再討論。
設置會話[5]的參考:e-docs . bea ./WLS/docs 70/web app/WebLogic _ XML。# 1036869.
六、HttpSession常見問題
(在本節中,session表示⑤和⑤的混合)
1和會話是什麽時候建立的?
壹個常見的誤解是,當有客戶端訪問時,會話就建立了,但事實是,直到服務器端程序調用諸如httpservletrequest之類的語句時,會話才建立。getsession (true)。請註意,如果JSP沒有顯示
因為session會消耗內存資源,所以如果不打算使用它,應該在所有JSP中關閉它。
2.會話是什麽時候刪除的?
基於前面的討論,在以下情況下刪除會話:a .程序調用http session . invalid();或者b、從最後壹次接收到客戶端發送的會話id開始的時間間隔超過了會話的超時設置;或者c .服務器進程停止(非持久會話)
3.瀏覽器關閉如何刪除會話?
嚴格來說是做不到的。可以做壹點努力,在所有客戶端頁面中使用javascript代碼window . on close來監控瀏覽器的關閉動作,然後向服務器發送刪除會話的請求。但是對於瀏覽器崩潰或者強行查殺程序等非常規手段還是無能為力。
4.HttpSessionListener怎麽了?
妳可以設置這樣壹個監聽器來監控會話的建立和銷毀,這樣當這樣的事件發生時妳就可以做壹些相應的工作。請註意,是會話的創建和銷毀觸發了偵聽器,而不是相反。與HttpSession相關的類似監聽器有HttpSessionBindingListener、HttpSessionActivationListener和HttpSessionAttributeListener。
5.存儲在會話中的對象必須是可序列化的嗎?
沒必要。只有在集群中復制或永久存儲會話,或者服務器在必要時臨時將會話換出內存時,才需要可序列化對象。在Weblogic Server的會話中放置不可序列化的對象將在控制臺上收到警告。如果我用過的壹個iPla版本的會話中有不可序列化的對象,那麽在會話被銷毀的時候就會出現異常,這就很奇怪了。
6.如何才能正確應對客戶端禁止cookie的可能?
對所有URL使用URL重寫,包括超鏈接、表單操作和重定向的URL。詳見[6]。
:e-docs . bea ./WLS/docs 70/web app/sessions。#100770
7.打開兩個瀏覽器窗口來訪問應用程序會使用相同的會話還是不同的會話?
參見第三節對cookies的討論。對於壹個會話來說,id是識別人的唯壹方式,所以不同的瀏覽器,不同的窗口打開方式,不同的cookies存儲方式都會對這個問題的答案產生影響。
8.如何防止用戶打開兩個瀏覽器窗口導致會話混亂?
這個問題類似於阻止表單的多次提交,可以通過設置客戶端的令牌來解決。也就是說,每當服務器生成壹個不同的id並將其返回給客戶機並存儲在會話中時,客戶機在提交表單時也必須將這個id返回給服務器。程序首先比較返回的id是否與會話中存儲的值壹致。如果不壹致,說明該操作已經提交。可以參考J2EE核心模式中的表示層模式。需要註意的是,對於javascript window.open打開的窗口,壹般不設置這個id,或者使用單獨的id,以防主窗口無法操作。建議不要修改window.open打開的窗口,這樣就不需要設置了。
9.為什麽要在Weblogic Server中更改session的值後再次調用session.setValue?
這個動作主要是提示在集群環境下Weblogic Server session中的值發生了變化,需要將新的session值復制到其他服務器程序中。
10,為什麽會話丟失?
除了會話正常故障,服務器本身的可能性應該很小,雖然筆者在帶幾個補丁的Solaris版iPla6SP1中也遇到過;瀏覽器插件的可能性其次,筆者也遇到過3721插件導致的問題;理論上,防火墻或代理服務器也可能在cookie處理方面出現問題。
出現這種問題的原因大多是程序錯誤,最常見的是在壹個應用中訪問另壹個應用。我們將在下壹節討論這個問題。
七、跨應用會話***享受
經常出現的情況是,壹個大項目被分成幾個小項目進行開發。為了互不幹擾,每個小項目都要求開發成壹個單獨的web應用。但是最後突然發現壹些小項目需要享受壹些信息,或者想用session實現SSO(單點登錄)。最自然的要求是應用程序可以訪問彼此的會話。
但是,根據Servlet規範,session的範圍應該限制在當前應用程序,不同的應用程序不能訪問彼此的會話。每個應用服務器從實際效果來看都遵守這個規範,但是實現細節可能不壹樣,所以解決跨應用會話***共享的方法也不壹樣。
首先,我們來看看Tomcat是如何隔離web應用程序之間的會話的。從Tomcat設置的cookie路徑來看,它為不同的應用設置了不同的cookie路徑,所以不同的應用使用不同的會話id,所以即使在同壹個瀏覽器窗口訪問不同的應用,發送到服務器的會話id也可以不同。
根據這個特點,我們可以推斷出Tomcat中session的內存結構大致如下。
我之前用過的iPla也是采用同樣的方法,估計SunONE和iPla不會有太大區別。對於這種服務器,解決方案比較簡單,在實踐中實現起來並不困難。要麽讓所有應用程序* * *共享壹個會話id,要麽讓應用程序獲取其他應用程序的會話id。
iPla中有壹個非常簡單的方法可以實現* * *享有壹個session id,即每個應用的cookie路徑設置為/(實際上應該是/NASApp,對於應用來說相當於根)。
& lt會話信息& gt
& lt路徑& gt/NASApp & lt;/path & gt;
& lt/session-info & gt;
需要註意的是* * * session的操作要遵循壹些編程約定,比如在session屬性的名稱前加上應用的前綴,這樣setAttribute("name "," neo ")就變成了set屬性(" app1。名稱”、“neo”),以防止命名空間沖突並導致相互覆蓋。
在Tomcat中沒有這樣方便的選擇。在Tomcat版本3中,我們還可以有壹些* * *享受會話的方法。目前作者還沒有找到Tomcat版以上的簡單方法。我們只能依靠第三方的力量,比如使用文件、數據庫、JMS或客戶端cookie、URL參數或隱藏字段。
讓我們看看Weblogic Server是如何處理會話的。
從截圖中可以看到,Weblogic Server為所有應用程序設置的cookie的路徑是/。這是否意味著在Weblogic Server中可以* * *默認享受會話?但是,壹個小實驗可以證明,即使不同的應用程序使用同壹個會話,每個應用程序也只能訪問自己設置的那些屬性。這說明Weblogic Server中session的內存結構可能如下。
對於這樣的結構,在會話機制本身的基礎上,應該無法解決會話享受的問題。除了依靠第三方的力量,比如使用文件、數據庫、JMS或客戶端cookie、URL參數或隱藏字段,還有壹種更方便的方法是將壹個應用的會話放在ServletContext中,這樣另壹個應用就可以從ServletContext中獲取前壹個應用的引用。示例代碼如下所示,
應用程序a
context.setAttribute("appA ",session);
應用程序b
contextA = context . get context("/appA ");
http session session a =(http session)contexta . get attribute(" appA ");
值得註意的是,這種用法是不可移植的,因為根據ServletContext的JavaDoc,應用服務器可以在security for context . get context("/appA ");返回空值,這在Weblogic Server 8.1中采用。
那麽為什麽Weblogic Server要把所有應用的cookie路徑設置為/?最初對於SSO,所有享受該會話的應用都可以* * *享受認證信息。壹個簡單的實驗就可以證明這壹點。如果您修改首先登錄的應用程序的描述符weblogic.xml,並將cookie路徑更改為/appA,則當您訪問另壹個應用程序時,會要求您再次登錄。即使您首先使用/的cookie路徑訪問應用程序,然後使用修改後的路徑訪問這個應用程序,登錄的用戶信息也會丟失。註意,做這個實驗的時候認證方法要用FORM,因為瀏覽器和web服務器有其他方式處理基本的認證方法,第二個請求的認證不是通過session實現的。詳見[7] SECION 14.8授權。您可以修改附加的示例程序來做這些實驗。
八。摘要
會話機制本身並不復雜,但其實現和配置的靈活性使得具體情況復雜多變。這也要求我們不能只把壹種體驗或者某個瀏覽器或服務器的體驗當成普遍適用的體驗,而總是要具體情況具體分析。
貿發會議第11屆會議主題翻譯成中文應該是主題的意思。
第十壹屆聯合國貿易和發展會議的主題。
中文的START是什麽?開始:英語?【stɑ?t];漂亮?[strt]
中文意思:
開始;開始
出發
開始;出發點
中文的pointtoyourears是什麽?指向妳的耳朵。
指向妳的耳朵。
ASA是壹種改性樹脂(ASA),是由丙烯腈、苯乙烯和丙烯酸酯橡膠組成的三元共聚物,於20世紀70年代研制成功。ASA屬於抗沖改性樹脂。
中文的fniday是什麽?星期五。
【英語】【?fra?德?】【美】【?fra?德?]
名詞(noun的縮寫)
星期五,星期五,星期五;魯濱遜漂流記的仆人;【姓名】【英文姓氏】Fredi可能是德語或猶太語姓名的英文翻譯;
復數:星期五
雙語示例
1
我不能在星期五之前完成這項工作。妳對我期望太高了。
我不能在星期五之前完成這項工作。妳對我期望太高了。
葡萄什麽葡萄是中國的?
基特,什麽是中文?Kit【英語】【kit】發音【美】【k?T]發音
詞典釋義
服裝及設備、成套用品、配套件
裝備某人。(針對特定活動)
傘什麽是中文?雨傘[?姆布雷爾。]
基礎翻譯
雨傘
網絡口譯
保護傘:保護傘|安布雷拉
傘形基金:如果計劃是傘形基金|傘形基金|傘形基金。
漏鬥傘:煙囪罩|煙囪頂罩|煙囪帽
跌倒和受傷在中文裏是什麽?摔倒受傷。
摔倒受傷。