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 相同即認為是同一個會話;
1
​ 在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信息;

 

 

 

 

 

 本文鏈接:https://blog.csdn.net/qq_28296925/article/details/80921585


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM