HTTP無狀態協議,是指協議對 於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。
客戶端與服務器進行動態交互的Web應用程序出現以後, HTTP無狀態的特性嚴重阻礙了這些應用程序的實現,畢竟交互是須要承前啓後的,簡單的購物車程序也要知道用戶到底在以前選擇了什麼商品。因而,兩種用於 保持HTTP鏈接狀態的技術就應運而生了,一個是 Cookie,而另外一個則是 Session。 HTTP自己是一個無狀態的鏈接協議,爲了支持客戶端與服務器之間的交互,咱們就須要經過不一樣的技術爲交互存儲狀態,而這些不一樣的技術就是Cookie和Session了。Cookie是經過客戶端保持狀態的解決方案。從定義上來講,Cookie就是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,而後客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息。讓咱們說得更具體一些:當用戶使用瀏覽器訪問一個支持Cookie的網站的時候,用戶會提供包括用戶名在內的我的信息而且提交至服務器;接着,服務器在向客戶端回傳相應的超文本的同時也會發回這些我的信息,固然這些信息並非存放在HTTP響應體(Response Body)中的,而是存放於HTTP響應頭(Response Header);當客戶端瀏覽器接收到來自服務器的響應以後,瀏覽器會將這些信息存放在一個統一的位置,對於Windows操做系統而言,咱們能夠從: [系統盤]:Documents and Settings[用戶名]Cookies目錄中找到存儲的Cookie;自此,客戶端再向服務器發送請求的時候,都會把相應的Cookie再次發回至服務器。而此次,Cookie信息則存放在HTTP請求頭(Request Header)了。斜體文字redis
有了Cookie這樣的技術實現,服務器在接收到來自客戶端瀏覽器的請求以後,就可以經過分析存放於請求頭的Cookie獲得客戶端特有的信息,從而動態生成與該客戶端相對應的內容。一般,咱們能夠從不少網站的登陸界面中看到「請記住我」這樣的選項,若是你勾選了它以後再登陸,那麼在下一次訪問該網站的時候就不須要進行重複而繁瑣的登陸動做了,而這個功能就是經過Cookie實現的。與Cookie相對的一個解決方案是Session,它是經過服務器來保持狀態的。因爲Session這個詞彙包含的語義不少,所以須要在這裏明確一下 Session的含義。首先,咱們一般都會把Session翻譯成會話,所以咱們能夠把客戶端瀏覽器與服務器之間一系列交互的動做稱爲一個 Session。從這個語義出發,咱們會提到Session持續的時間,會提到在Session過程當中進行了什麼操做等等;其次,Session指的是服務器端爲客戶端所開闢的存儲空間,在其中保存的信息就是用於保持狀態。從這個語義出發,咱們則會提到往Session中存放什麼內容,如何根據鍵值從 Session中獲取匹配的內容等。
要使用Session,第一步固然是建立Session了。那麼Session在什麼時候建立呢?固然仍是在服務器端程序運行的過程當中建立的,不一樣語言實現的應用程序有不一樣建立Session的方法,而在Java中是經過調用HttpServletRequest的getSession方法(使用true做爲參數)建立的。在建立了Session的同時,服務器會爲該Session生成惟一的Session id,而這個Session id在隨後的請求中會被用來從新得到已經建立的Session;在Session被建立以後,就能夠調用Session相關的方法往Session中增長內容了,而這些內容只會保存在服務器中,發到客戶端的只有Session id;當客戶端再次發送請求的時候,會將這個Session id帶上,服務器接受到請求以後就會依據Session id找到相應的Session,從而再次使用之。正是這樣一個過程,用戶的狀態也就得以保持了。
綜上所述,HTTP自己是一個無狀態的鏈接協議,爲了支持客戶端與服務器之間的交互,咱們就須要經過不一樣的技術爲交互存儲狀態,而這些不一樣的技術就是Cookie和Session了。數據庫
cookie數據存放在客戶的 瀏覽器上,服務器可以知道其中的信息;
若是在瀏覽器中 不設置過時時間,cookie被保存在 內存中,生命週期隨 瀏覽器的關閉而結束,這種cookie簡稱會話cookie。若是在瀏覽器中設置了cookie的過時時間,cookie被保存在硬盤中,關閉瀏覽器後,cookie數據仍然存在,直到過時時間結束才消失。後端
單個cookie保存的數據 不能超過4KB,一個服務器最多在客戶端瀏覽器上保存 20個Cookie,一個瀏覽器最多保存 300個Cookie;
cookie只能保存字符串類型,以 文本的方式
cookie技術有4個組件:在HTTP響應報文中有一個cookie首部行;在HTTP請求報文中有一個cookie首部行;在用戶端系統中保留有一個cookie文件,並由用戶的瀏覽器進行管理;位於Web站點的一個後端數據庫
cookie中若是設置了路徑參數,那麼同一個網站中不一樣路徑下的cookie互相是訪問不到的。
大小受限、用戶能夠操做(禁用)cookie,使功能受限、、安全性較低、有些狀態不可能保存在客戶端、每次訪問都要傳送cookie給服務器,浪費帶寬、cookie數據有路徑(path)的概念,能夠限制cookie只屬於某個路徑下。
攜帶cookie進行數據請求跨域
cookie數據始終在同源的http請求中攜帶(即便不須要),即cookie在瀏覽器和服務器間來回傳遞;
每次請求一個新的頁面的時候cookie都會被髮送過去,這樣無形中浪費了帶寬,另外cookie還須要指定做用域,不可跨域調用。
session數據放在 服務器上,客戶端不知道其中的信息,不過session能夠經過特殊的方式作持久化管理(memcache,redis);
session在何時建立,以及session一致性問題瀏覽器
session會在 必定時間內保存在服務器上,當訪問增多,會比較佔用你服務器的性能,考慮到減輕服務器性能方面,應當使用cookie
當程序須要爲某個客戶端的請求建立一個session時,服務器首先 檢查這個客戶端的請求裏 是否已包含了一個 session標識(稱爲session id),若是已包含則說明之前已經爲此客戶端建立過session,服務器就 按照session id把這個session檢索出來使用( 檢索不到,會新建一個),若是客戶端請求不包含session id,則爲客戶端建立一個session而且生成一個與此session相關聯的session id, session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存。保存這個session id的方式能夠採用cookie,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器。一般使用cookie方式存儲sessionid到客戶端,在交互中瀏覽器按照規則將sessionid發送給服務器。若是用戶禁用cookie,則要使用URL重寫,能夠經過response.encodeURL(url)
進行實現;API對encodeURL的結束爲,當瀏覽器支持Cookie時,url不作任何處理;當瀏覽器不支持Cookie的時候,將會重寫URL將SessionID拼接到訪問地址後。安全
session 大小沒有限制
session中保存的是 對象,session經過相似與Hashtable的數據結構來保存,能支持任何類型的對象(session中可含有多個對象)
Session用於保存每一個用戶的專用信息,變量的值保存在服務器端,經過SessionID來區分不一樣的客戶。
session不能區分路徑,同一個用戶在訪問一個網站期間,全部的session在任何一個地方均可以訪問到。
Session保存的東西越多,就越佔用服務器內存,對於用戶在線人數較多的網站,服務器的內存壓力會比較大、依賴於cookie(sessionID保存在cookie),若是禁用cookie,則要使用URL重寫,不安全、建立Session變量有很大的隨意性,可隨時調用,不須要開發者作精確地處理,因此,過分使用session變量將會致使代碼不可讀並且很差維護。