session與cookie之間的關係
一、客戶端與服務端請求響應的關係
USER(客戶端) 請求 tomcat(伺服器), 屬於HTTP請求。http請求是無狀態的,即每次服務端接收到客戶端的請求時,都是一個全新的請求,伺服器並不知道客戶端的歷史請求記錄;所以當用戶從客戶端請求一次登入後,登入成功,再次進行請求時,因為tomcat不能識別這兩次會話都是來自同一個瀏覽器,即服務端不知道客戶端的歷史請求記錄;就會再次彈出登入對話方塊。
為了解決客戶端與服務端會話同步問題。這便引出了下面幾個概念:cookie、session。
於是,我們便把伺服器中產生的會話sessionID儲存到客戶端瀏覽器cookie中去。在客戶端存在週期為瀏覽器關閉時,消失。這樣便解決了客戶端請求服務端會話不同步問題。
二、cookie是什麼
一個HTTP cookie的(網路Cookie,瀏覽器cookie)是一小片資料的一個伺服器傳送到使用者的網路瀏覽器。瀏覽器可以儲存它並將其與下一個請求一起傳送回同一伺服器。通常,它用於判斷兩個請求是否來自同一個瀏覽器 - 例如,保持使用者登入。它記住無狀態 HTTP協議的有狀態資訊。
三、session是什麼
客戶端請求服務端,服務端(Tomcat)會為這次請求開闢一塊記憶體空間,這個物件便是Session物件, 儲存結構為ConcurrentHashMap。
session的目的:彌補HTTP無狀態特性,伺服器可以利用session儲存客戶端在同一個會話期間的一些操作記錄。
四、HTTP是無狀態的
在同一連線上連續執行的兩個請求之間沒有連結。對於試圖與某些頁面連貫地相互作用的使用者而言,這立即存在問題,例如,使用電子商務購物籃。但是,雖然HTTP本身的核心是無狀態,但HTTP cookie允許使用有狀態會話。使用標頭可擴充套件性,HTTP Cookie被新增到工作流中,允許在每個HTTP請求上建立會話以共享相同的上下文或相同的狀態。
五、session的實現機制
1、伺服器如何判斷客戶端傳送過來的請求屬於同一個會話?
用session id區分;session id 相同即認為是同一個會話;
在tomcat中session id中用JSESSIONID來表示;
2、伺服器、客戶端如何獲取sessionID?SessionID在期間是如何傳輸的?
伺服器第一次接收到請求時,開闢了一塊Session空間(建立了Session物件),同時生成一個Session id,並通過響應頭的Set-Cookie:“JSESSIONID=XXXXXXX”命令,向客戶端傳送要求設定cookie的響應; 客戶端收到響應後,在本機客戶端設定了一個JSESSIONID=XXXXXXX的cookie資訊,該cookie的過期時間為瀏覽器會話結束;
接下來客戶端每次向同一個網站傳送請求時,請求頭都會帶上該cookie資訊(包含Session id); 然後,伺服器通過讀取請求頭中的Cookie資訊,獲取名稱為JSESSIONID的值,得到此次請求的Session id;
注意:伺服器只會在客戶端第一次請求響應的時候,在響應頭上新增Set-Cookie:“JSESSIONID=XXXXXXX”資訊,接下來在同一個會話的第二第三次響應頭裡,是不會新增Set- Cookie:“JSESSIONID=XXXXXXX”資訊的; 而客戶端是會在每次請求頭的cookie中帶上JSESSIONID資訊;
參考連結資料