java session 詳解

原網址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html

一、術語session

  在我的經驗里,session這個詞被濫用的程度大概僅次于transaction,更加有趣的是transaction和session在某些語境下的含義是相同的。

  session,中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程能稱之為一個session。有時候我們能看到這樣的話“在一個瀏覽器會話期間,...”,這里的會話一詞用的就是其本義,是指從一個瀏覽器窗口打開到關閉這個期間①。最混亂的是“用戶(客戶端)在一次會話期間”這樣一句話,他可能指用戶的一系列動作(一般情況下是同某個具體目的相關的一系列動作,比如從登錄到選購商品到結賬登出這樣一個網上購物的過程,有時候也被稱為一個transaction),然而有時候也可能僅僅是指一次連接,也有可能是指含義①,其中的差別只能靠上下文來推斷②。

  然而當session一詞和網絡協議相關聯時,他又往往隱含了“面向連接”和/或“保持狀態”這樣兩個含義,“面向連接”指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始,和此相對的是寫信,在你把信發出去的時候你并不能確認對方的地址是否正確,通信渠道不一定能建立,但對發信人來說,通信已開始了。“保持狀態”則是指通信的一方能夠把一系列的消息關聯起來,使得消息之間能互相依賴,比如一個服務員能夠認出再次光臨的老顧客并且記得上次這個顧客還欠店里一塊錢。這一類的例子有“一個TCP session”或“一個POP3 session”③。

  而到了web服務器蓬勃發展的時代,session在web研發語境下的語義又有了新的擴展,他的含義是指一類用來在客戶端和服務器之間保持狀態的解決方案④。有時候session也用來指這種解決方案的存儲結構,如“把xxx保存在session里”⑤。由于各種用于web研發的語言在一定程度上都提供了對這種解決方案的支持,所以在某種特定語言的語境下,session也被用來指代該語言的解決方案,比如經常把Java里提供的javax.servlet.http.HttpSession簡稱為session⑥。

  鑒于這種混亂已不可改動,本文中session一詞的運用也會根據上下文有不同的含義,請大家注意分辨。

  在本文中,使用中文“瀏覽器會話期間”來表達含義①,使用“session機制”來表達含義④,使用“session”表達含義⑤,使用具體的“HttpSession”來表達含義⑥

  二、HTTP協議和狀態保持

  HTTP協議本身是無狀態的,這和HTTP協議本來的目的是相符的,客戶端只需要簡單的向服務器請求下載某些文件,無論是客戶端還是服務器都沒有必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或一個普通的(非會員制)大賣場之間的關系相同。

  然而聰明(或貪心?)的人們非常快發現如果能夠提供一些按需生成的動態信息會使web變得更加有用,就像給有線電視加上點播功能相同。這種需求一方面迫使HTML逐步添加了表單、腳本、DOM等客戶端行為,另一方面在服務器端則出現了CGI規范以響應客戶端的動態請求,作為傳輸載體的HTTP協議也添加了文件上載、cookie這些特性。其中cookie的作用就是為了解決HTTP協議無狀態的缺陷所作出的努力。至于后來出現的session機制則是又一種在客戶端和服務器之間保持狀態的解決方案。

  讓我們用幾個例子來描述一下cookie和session機制之間的差別和聯系。筆者原來常去的一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:

  1、該店的店員非常厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎么對待了。這種做法就是協議本身支持狀態。

  2、發給顧客一張卡片,上面記錄著消費的數量,一般更有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會和以前或以后的消費相聯系起來。這種做法就是在客戶端保持狀態。

  3、發給顧客一張會員卡,除了卡號之外什么信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店里的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在服務器端保持狀態。

  由于HTTP協議是無狀態的,而出于種種考慮也不希望使之成為有狀態的,因此,后面兩種方案就成為現實的選擇。具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。同時我們也看到,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上他更有其他選擇。

  三、理解cookie機制?

  cookie機制的基本原理就如上面的例子相同簡單,不過更有幾個問題需要解決:“會員卡”怎么分發;“會員卡”的內容;及客戶怎么使用“會員卡”。

  正統的cookie分發是通過擴展HTTP協議來實現的,服務器通過在HTTP的響應頭中加上一行特別的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或VBScript也能生成cookie。

  而cookie的使用是由瀏覽器按照一定的原則在后臺自動發送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發送給服務器。意思是麥當勞的會員卡只能在麥當勞的店里出示,如果某家分店還發行了自己的會員卡,那么進這家店的時候除了要出示麥當勞的會員卡,還要出示這家店的會員卡。

  cookie的內容主要包括:名字,值,過期時間,路徑和域。

  其中域能指定某一個域比如.google.com,相當于總店招牌,比如寶潔公司,也能指定一個域下的具體某臺機器比如www.google.com或froogle.google.com,能用飄柔來做比。

  路徑就是跟在域名后面的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。瀏覽器對于會話cookie的這種只認cookie不認人的處理方式經常給采用session機制的web應用程式研發者造成非常大的困擾。

  下面就是個goolge設置cookie的響應頭的例子

HTTP/1.1 302 Found
Location:?http://www.google.com/intl/zh-CN/
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Content-Type: text/html


  這是使用HTTPLook這個HTTP Sniffer軟件來俘獲的HTTP通訊紀錄的一部分



  瀏覽器在再次訪問goolge的資源時自動向外發送cookie


  使用Firefox能非常容易的觀察現有的cookie的值

  使用HTTPLook配合Firefox能非常容易的理解cookie的工作原理。



  IE也能設置在接受cookie前詢問


  這是個詢問接受cookie的對話框。

  四、理解session機制

 session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。

  當程式需要為某個客戶端的請求創建一個session的時候,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識?-?稱為session id,如果已包含一個session id則說明以前已為此客戶端創建過session,服務器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session并且生成一個和此session相關聯的session id,session id的值應該是個既不會重復,植蝗菀妝徽業焦媛梢苑略斕淖址???飧?ession id將被在本次響應中返回給客戶端保存。

  保存這個session id的方式能采用cookie,這樣在交互過程中瀏覽器能自動的按照規則把這個標識發揮給服務器。一般這個cookie的名字都是類似于SEEESIONID,而。比如weblogic對于web應用程式生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,他的名字就是JSESSIONID。

  由于cookie能被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面,附加方式也有兩種,一種是作為URL路徑的附加信息,表現形式為http://...../xxx;jsessionid=ByOK ... 99zWpBng!-145788764另一種是作為查詢字符串附加在URL后面,表現形式為http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764
這兩種方式對于用戶來說是沒有差別的,只是服務器在解析的時候處理的方式不同,采用第一種方式也有利于把session id的信息和正常程式參數區分開來。

  為了在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑后面都包含這個session id。

  另一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。

  這種技術目前已較少應用,筆者接觸過的非常古老的iPlanet6(SunONE應用服務器的前身)就使用了這種技術。實際上這種技術能簡單的用對action應用URL重寫來代替。

  在談論session機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實能想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是相同的,除非程式通知服務器刪除一個session,否則服務器會一直保留,程式一般都是在用戶做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知服務器他將要關閉,因此服務器根本不會有機會知道瀏覽器已關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器后這個session id就消失了,再次連接服務器時也就無法找到原來的session。如果服務器設置的cookie被保存到硬盤上,或使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給服務器,則再次打開瀏覽器仍然能夠找到原來的session。

  恰恰是由于關閉瀏覽器不會導致session被刪除,迫使服務器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,服務器就能認為客戶端已停止了活動,才會把session刪除以節省存儲空間。

  五、理解javax.servlet.http.HttpSession

轉載于:https://www.cnblogs.com/hujunzheng/p/4154071.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531549.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Session監聽器

Session監聽器&#xff0c;是用來監聽session對象創建和關閉的。有時我們需要在session創建或關閉時執行一些操作。這是就可以使用Session Listenner。1.在項目的web.xml文件中添加如下代碼&#xff1a;[html] view plaincopy <!--添加Session監聽器--> <listener>…

陷阱計算機音樂譜大全,陷阱 原版C調-王北車-和弦譜-《彈吧》官網tan8.com-和弦譜大全,學吉他,秀吉他...

E此瀏覽器不支持畫布前奏掃弦 C Fm C Fm C Am F G7主C Em一封信兩年都沒動筆C Am三個字過了幾個四季F G你是有多想逃避Em Am來不及問問你Dm G我已經錯過相愛的日期C Em那天你消失在人海里C Am你的背影沉默得讓人恐懼F G Em Am你說的那些問題 我回答得很堅定Dm G偏偏那個時候我最…

江蘇省計算機學會博士論文,江蘇學會網 歡迎您成為江蘇省計算機學會會員

根據蘇科協發【2004】5號文件新精神&#xff0c;以單位名義加入學術團體&#xff0c;只成為該學術團體的單位會員&#xff0c;而非意味著該單位所有成員團體入會。該文件的實質是鼓勵以個人身份加入學術團體。因此&#xff0c;歡迎本省內凡符合江蘇省計算機學會會員條件的人士&…

Packet for query is too large(1767212 1048576)mysql在存儲圖片時提示圖片過大

原網址&#xff1a;http://blog.csdn.net/bigbird2012/article/details/6304417 錯誤現象&#xff1a;Packet for query is too large(1767212 > 1048576),You can change this value on the server by setting the max_allow_packet variable.解決辦法&#xff1a;MySQL的一…

江蘇省公務員計算機類130分,130分,在江蘇省考中是什么水平?

原標題&#xff1a;130分&#xff0c;在江蘇省考中是什么水平&#xff1f;關鍵詞回復獲取更多詳情更多公考常識&#xff0c;后臺回復【常識】更多公考素材&#xff0c;后臺回復【素材】【130】在江蘇算是公考進面的一道普遍門檻。對于2020江蘇省考的考生&#xff0c;130分應定為…

js連續指定兩次或者多次的click事件(解決辦法)

setTimeout (表達式,延時時間)setTimeout(表達式,交互時間)延時時間/交互時間是以豪秒為單位的(1000ms1s) setTimeout 在執行時,是在載入后延遲指定時間后,去執行一次表達式,僅執行一次setTimeout 在執行時,它從載入后,每隔指定的時間就執行一次表達式 if(ischoose false){is…

軟件測試項目時間一般多少錢,項目的時間進度該如何估算?

后來&#xff0c;開發一周左右&#xff0c;發現原來使用的模塊&#xff0c;要用新的接口A&#xff0c;但是接口A還不能滿足我現有的需求&#xff0c;必須需要程序員A重新包裝給我&#xff0c;這樣再等了一下午&#xff0c;第二天&#xff0c;問題不斷&#xff0c;不停的跟程序員…

js選擇目錄

找了好久&#xff0c;終于找到了! function browseFolder(path) {//打開本地目錄&#xff08;目錄選擇功能&#xff09;try {var Message "\u8bf7\u9009\u62e9\u6587\u4ef6\u5939"; //選擇框提示信息var Shell new ActiveXObject("Shell.Application");v…

計算機寄存器端口,CPU和外設之間的數據傳送方式有哪幾種

數據傳輸(data transmission)&#xff0c;指的是依照適當的規程&#xff0c;經過一條或多條鏈路&#xff0c;在數據源和數據宿之間傳送數據的過程。也表示借助信道上的信號將數據從一處送往另一處的操作。CPU與外設之間的數據傳輸有以下三種方式&#xff1a;程序方式、中斷方式…

js 獲得radio的值

var tmp document.getElementsByName("foodtype"); for(var i0; i<tmp.length; i)if(tmp.item(i).checked){alert(tmp.item(i).getAttribute("value"));} 轉載于:https://www.cnblogs.com/hujunzheng/p/4167897.html

js實現打開本地文件或文件夾

原網址&#xff1a;http://blog.csdn.net/cofesun/article/details/7904887javascript有個特殊的對象ActiveXObject&#xff0c;通過它可以訪問windows的本地文件系統和應用程序<script>function openFileIIs(filename){ try{ var objnew ActiveXObject("ws…

茌平計算機中考成績查詢,中考成績查詢系統入口2021

湘潭市的中考成績查詢&#xff0c;需要在通道開通之后進行&#xff0c;那么查詢通道在哪里呢&#xff1f;想必大家都很想知道。下面出國留學網小編為大家帶來湘潭中考成績查詢系統入口2021&#xff0c;僅供參考&#xff0c;歡迎閱讀。拓展閱讀&#xff1a;中考后有哪些選擇出路…

java生成excel文件

首先下載jexcelapi_2_6_12.tar.gz&#xff0c;解壓后將里面的jxl.jar復制到WEB-INF/lib目錄下面      String filePath request.getParameter("filePath");filePathfilePath.replaceAll("\\\\", "/");FileOutputStream os new FileOutp…

win10證書服務器不可用,win10系統提示“安全證書的吊銷信息不可用”的修復方法...

在windows10系統下一位用戶遇到了奇怪的問題&#xff0c;該用戶表示瀏覽網頁的時候經常會彈出安全警報&#xff1a;該鎮點安全證書的吊銷信息不可用。是否繼續&#xff1f; 的報錯彈窗&#xff0c;這是怎么回事呢&#xff1f;其實&#xff0c;該問題是由于ie瀏覽器中的設置出現…

jsp獲得文件的絕對路徑

當前WEB應用的物理路徑&#xff1a;<%application.getRealPath("/")%>當前訪問的JSP文件的物理路徑&#xff1a;<%application.getRealPath(request.getRequestURI())%& gt;當前訪問jsp文件的所在目錄的物理路徑&#xff1a;<% String pathapplic…

清明節游戲服務器維護,清明節游戲活動【4月2日--4月16日】

活動一&#xff1a;百鬼夜行活動時間&#xff1a; 2020年4月2日維護結束----2020年4月16日維護結束活動內容&#xff1a;清明將至&#xff0c;世間陰氣逐漸濃郁&#xff0c;總有一些小鬼借機生亂&#xff0c;為了防止百鬼夜行這樣的事情再次發生&#xff0c;拜托你前往銀欄村和…

錯誤:document.getElementById(userForm).submit();Object is not a function

表單提交時發生的錯誤解決辦法&#xff1a; 利用這種方法進行表單提交的時候&#xff0c;表單中的元素不能有 name"submit"的元素&#xff0c;否則該元素會與submit()方法造成混淆&#xff0c;導致錯誤! 轉載于:https://www.cnblogs.com/hujunzheng/p/4180252.html

暴走大俠顯示進入服務器失敗,暴走大俠:常見問題詳解,再遇見這樣的問題也不再迷糊...

相信玩了這么久的英雄好漢們&#xff0c;對這個游戲的理解已經有了一定的了解。同時也應該有很多疑問&#xff0c;幾天就給大家詳細的講解下最近幾天大家關心最多的問題。關于門派選擇問題&#xff0c;主動技能怎學&#xff1f;答&#xff1a;門派問題的話&#xff0c;這個最好…

mysql數據庫移植

在mysql數據庫移植的時候&#xff0c;把自己電腦上mysql中data目錄的一些重要文件復制到其他電腦上&#xff0c;先備份一下其他電腦上的mysql的data目錄&#xff0c;然后替換&#xff01; 例如我的mysql默認的數據庫文件位置&#xff1a; C:\ProgramData\MySQL\MySQL Server 5.…

win系統如何連接共享服務器,window7 pro 訪問局域網內共享服務器

您好&#xff0c;Windows 7 相比較Windows XP增強了安全性等功能。或許您之前設置對Windows XP訪問的權限并不支持Windows 7 。可能因為服務器不識別Windows 7新的連接憑據(前提是存在過舊的連接憑據)。建議您在文件服務器端重新設置一下共享文件夾的本地 NTFS 權限&#xff0c…