關於Session、Cookie的介紹

一、爲什麼產生了cookie和session?

HTTP 協議是一種無狀態協議,即每次服務端接收到客戶端的請求時,都是一個全新的請求,服務器並不知道客戶端的歷史請求記錄;Session 和 Cookie 的主要目的就是爲了彌補 HTTP 的無狀態特性


二、關於Session

2.1 Session是什麼?

客戶端請求服務端,服務端會爲這次請求開闢一塊內存空間,這個對象便是 Session 對象,存儲結構爲 ConcurrentHashMap。Session 彌補了 HTTP 無狀態特性,服務器可以利用 Session 存儲客戶端在同一個會話期間的一些操作記錄

2.2 Session 如何判斷是否是同一會話?

服務器第一次接收到請求時,開闢了一塊 Session 空間(創建了Session對象),同時生成一個 sessionId ,並通過響應頭的 Set-Cookie:JSESSIONID=XXXXXXX 命令向客戶端發送要求設置 Cookie 的響應;客戶端收到響應後,在本機客戶端設置了一個 JSESSIONID=XXXXXXX 的 Cookie 信息,該 Cookie 的過期時間爲瀏覽器會話結束。
在這裏插入圖片描述
接下來客戶端每次向同一個網站發送請求時,請求頭都會帶上該 Cookie 信息(包含 sessionId ), 然後,服務器通過讀取請求頭中的 Cookie 信息,獲取名稱爲 JSESSIONID 的值,得到此次請求的 sessionId

2.3 Session 的缺點

Session 機制有個缺點,比如 A 服務器存儲了 Session,就是做了負載均衡後,假如一段時間內 A 的訪問量激增,會轉發到 B 進行訪問,但是 B 服務器並沒有存儲 A 的 Session,會導致 Session 的失效。


三、關於Cookie

服務器發送到瀏覽器的 Cookie,瀏覽器會進行存儲,並與下一個請求一起發送到服務器。通常,它用於判斷兩個請求是否來自於同一個瀏覽器,例如用戶保持登錄狀態。

缺點:Cookie 曾經用於一般的客戶端存儲。雖然這是合法的,因爲它們是在客戶端上存儲數據的唯一方法,但如今建議使用現代存儲 API。Cookie 隨每個請求一起發送,因此它們可能會降低性能(尤其是對於移動數據連接而言)。

在這裏插入圖片描述

3.1 創建 Cookie

當接收到客戶端發出的 HTTP 請求時,服務器可以發送帶有響應的 Set-Cookie 標頭,Cookie 通常由瀏覽器存儲,然後將 Cookie 與 HTTP 標頭一同向服務器發出請求。

Set-Cookie HTTP 響應標頭將 cookie 從服務器發送到用戶代理。下面是一個發送 Cookie 的例子:
在這裏插入圖片描述
此標頭告訴客戶端存儲 Cookie

現在,隨着對服務器的每個新請求,瀏覽器將使用 Cookie 頭將所有以前存儲的 Cookie 發送回服務器
在這裏插入圖片描述

在這裏插入圖片描述
Session Cookies 也稱爲會話 Cookies,在 Session Cookies 中,用戶的登錄狀態會保存在服務器的內存中。當用戶登錄時,Session 就被服務端安全的創建。

在每次請求時,服務器都會從會話 Cookie 中讀取 SessionId,如果服務端的數據和讀取的 SessionId 相同,那麼服務器就會發送響應給瀏覽器,允許用戶登錄。
在這裏插入圖片描述


四、禁用 Cookies,如何使用 Session ?

  1. 如果禁用了 Cookies,服務器仍會將 sessionId 以 cookie 的方式發送給瀏覽器,但是,瀏覽器不再保存這個cookie (即sessionId) 了。
  2. 如果想要繼續使用 session,需要採用 URL 重寫 的方式來實現

什麼是URL重寫?
瀏覽器在訪問服務器上的某個地址時,不能夠直接寫這個組件的地址,而應該使用服務器生成的這個地址


參考文章:

  1. 看完這篇 Session、Cookie、Token,和麪試官扯皮就沒問題了

  2. php開發面試題—禁用cookie之後,如何使用session

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章