HTTP無狀態協議和cookie、session原理

無狀態協議是指協議對務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。 Http協議不像創建了socket鏈接的兩個終端,雙方是能夠互相通訊的,http的客戶端只能經過請求服務器來獲取相關內容或文件信息,具體內容能夠經過個人另外一篇文章瞭解。web

http協議這種特性有優勢也有缺點,優勢在於解放了服務器,每一次請求「點到爲止」不會形成沒必要要鏈接佔用,缺點在於每次請求會傳輸大量重複的內容信息。算法

客戶端與服務器進行動態交互的Web應用程序出現以後,HTTP無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互是須要承前啓後的,簡單的購物車程序也要知道用戶到底在以前選擇了什麼商品。因而,兩種用於保持HTTP鏈接狀態的技術就應運而生了,一個是Cookie,而另外一個則是Session。HTTP自己是一個無狀態的鏈接協議,爲了支持客戶端與服務器之間的交互,咱們就須要經過不一樣的技術爲交互存儲狀態,而這些不一樣的技術就是Cookie和Session了。瀏覽器

先來講說Cookie:tomcat

Cookie的產生安全

Cookie最先是網景公司的前僱員Lou Montulli在1993年3月的發明。服務器

Cookie是由服務器端生成,發送給User-Agent(通常是web瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置爲啓用Cookie)。Cookie名稱和值能夠由服務器端開發本身定義,對於JSP而言也能夠直接寫入Sessionid,這樣服務器能夠知道該用戶是否合法用戶以及是否須要從新登陸等。網絡

Cookie用途session

Cookies最典型的應用是斷定註冊用戶是否已經登陸網站,用戶可能會獲得提示,是否在下一次進入此網站時保留用戶信息以便簡化登陸手續,這些都是Cookies的功用。另外一個重要應用場合是「購物車」之類處理。用戶可能會在一段時間內在同一家網站的不一樣頁面中選擇不一樣的商品,這些信息都會寫入Cookies,以便在最後付款時提取信息。socket

Cookie生存週期網站

Cookie能夠保持登陸信息到用戶下次與服務器的會話,換句話說,下次訪問同一網站時,用戶會發現沒必要輸入用戶名和密碼就已經登陸了(固然,不排除用戶手工刪除Cookie)。而還有一些Cookie在用戶退出會話的時候就被刪除了,這樣能夠有效保護我的隱私。

Cookie在生成時就會被指定一個Expire值,這就是Cookie的生存週期,在這個週期內Cookie有效,超出週期Cookie就會被清除。有些頁面將Cookie的生存週期設置爲「0」或負值,這樣在關閉頁面時,就立刻清除Cookie,不會記錄用戶信息,更加安全。

Session:在計算機中,尤爲是在網絡應用中,稱爲「會話」。

Session簡介

Session直接翻譯成中文比較困難,通常都譯成時域。在計算機專業術語中,Session是指一個終端用戶與交互系統進行通訊的時間間隔,一般指從註冊進入系統到註銷退出系統之間所通過的時間以及若是須要的話,可能還有必定的操做空間。

具體到Web中的Session指的就是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉所通過的這段時間,也就是用戶瀏覽這個網站所花費的時間。所以從上述的定義中咱們能夠看到,Session其實是一個特定的時間概念。

須要注意的是,一個Session的概念須要包括特定的客戶端,特定的服務器端以及不中斷的操做時間。A用戶和C服務器創建鏈接時所處的Session同B用戶和C服務器創建鏈接時所處的Session是兩個不一樣的Session。

什麼時候產生Session,怎樣產生Session?

當客戶端訪問服務器時,服務器根據需求設置Session,將會話信息保存在服務器上,同時將標示Session的SessionId傳遞給客戶端瀏覽器,

瀏覽器將這個SessionId保存在內存中,咱們稱之爲無過時時間的Cookie。瀏覽器關閉後,這個Cookie就會被清掉,它不會存在於用戶的Cookie臨時文件

之後瀏覽器每次請求都會額外加上這個參數值,服務器會根據這個SessionId,就能取得客戶端的數據信息。

若是客戶端瀏覽器意外關閉,服務器保存的Session數據不是當即釋放,此時數據還會存在,只要咱們知道那個SessionId,就能夠繼續經過請求得到此Session的信息,由於此時後臺的Session還存在,固然咱們能夠設置一個Session超時時間,一旦超過規定時間沒有客戶端請求時,服務器就會清除對應SessionId的Session信息。

綜上所述咱們能夠理解Session的創建流程是:

當用瀏覽器登陸到某網站服務器時,先找對應的Cookie文件,當首次訪問是固然沒有Cookie文件,因此在請求頭部中沒有Cookie的內容,即在請求頭部中沒有相似Cookie:
JSESSIONID=XXXXXXXXXXXXXXX的內容,這時當請求到達服務器後,服務器看請求頭中沒有JSESSIONID值,因而生成一個Session對象,並由某種算法產生一個值賦給這個Session的id,並將SessionId,和Session對象放入HashMap中,而後將這個SessionId發回以客戶端,即在響應的頭部有一行:Set-Cookie:JSESSIONID=XXXXXXXXXXXXXX,瀏覽器解析後會將在JSESSIONID和值記錄到Cookie中。

當用瀏覽器再次請求此網站的另外一頁面時,瀏覽器檢查看有沒有Cookie,這時有Cookie(前提是Cookie沒有過時),會自動的把Cookie的內容附加到請求頭中,即在請求頭附加了一行:Cookie:
JSESSIONID=XXXXXXXXXXXXXXXXXXXXXXX,服務器接收到請求後會根據JSESSIONID的值知道SessionId的值,在tomcat中兩個值是同樣的,而後你可根據這個SessionId找到對應的Session,可由Session中登陸後設定的某些值是否爲空,來判斷此用戶是否登陸。

clipboard.png

clipboard.png

當用戶安全登出後(調用session.invalidate()),服務器會將Session銷燬,並生成一個新的JSESSIONID發回用客戶端,瀏覽器接收響應後,會將Cookie中的JSESSIONID換成新值,當用戶再次訪問此服務器時,會在請求中自動的加入新的JSESSIONID的值發到服務器,這時服務器根據JSESSIONID找不對應的Session了,所以就可知道是一次新的會話,服務器會生成一個Session對象,並將客戶端發過來的JSESSION的值賦給這個Session的id。

若是客戶端禁用了Cookie那麼服務器可就沒法將session內容與客戶端對應上了。

Session以tomcat爲例默認是保存在內存中的,可是咱們能夠經過配置將Session持久化,保存在硬盤文件中

相關文章
相關標籤/搜索