javascript cookie session和web storage儲存
眾所周知,http是一種無狀態儲存,現實中的業務需要一定的業務狀態,例如某電商網站的使用者登入,購物車。如何標示使用者和認證一個使用者,最早的方案就是cookie儲存了。
通過引入cookie和session體系機制來維護狀態資訊。即使用者第一次訪問伺服器的時候,伺服器響應報頭通常會出現一個Set-Cookie響應頭,這裡其實就是在本地設定一個cookie,當用戶再次訪問伺服器的時候,http會附帶這個cookie過去,cookie中存有sessionId這樣的資訊來到伺服器這邊確認是否屬於同一次會話
cookie的處理分為如下幾步:
1.伺服器向客戶端傳送cookie
2.瀏覽器將cookie儲存。
3.瀏覽器每次請求都會將cookie傳送到伺服器端
cookie同源與跨域:
同源策略:URL由協議、域名、埠和路徑組成,如果兩個URL的協議、域名和埠相同,則表示他們同源。瀏覽器的同源策略,限制了來自不同源的"document"或指令碼,對當前"document"讀取或設定某些屬性。
對於Cookie來說,Cookie的同源只關注域名,是忽略協議和埠的。所以一般情況下,https://localhost:80/和http://localhost:8080/的Cookie是共享的。
Cookie是不可跨域的;在沒有經過任何處理的情況下,二級域名不同也是不行的。(wenku.baidu.com和baike.baidu.com)。
Session
Cookie機制彌補了HTTP協議無狀態的不足。在Session出現之前,基本上所有的網站都採用Cookie來跟蹤會話。
與Cookie不同的是,session是以服務端儲存狀態的。
session機制原理
當客戶端請求建立一個session的時候,伺服器會先檢查這個客戶端的請求裡是否已包含了一個session標識 - sessionId,
如果已包含這個sessionId,則說明以前已經為此客戶端建立過session,伺服器就按照sessionId把這個session檢索出來使用(如果檢索不到,可能會新建一個)
如果客戶端請求不包含sessionId,則為此客戶端建立一個session並且生成一個與此session相關聯的sessionId
sessionId的值一般是一個既不會重複,又不容易被仿造的字串,這個sessionId將被在本次響應中返回給客戶端儲存。儲存sessionId的方式大多情況下用的是cookie。
思考一下服務端如何識別特定的客戶?:
這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie資訊到服務端。實際上大多數的應用都是用 Cookie來實現Session跟蹤的,第一次建立Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 裡面記錄一個Session ID,以後每次請求把這個會話ID傳送到伺服器,我就知道你是誰了。
本來 session 是一個抽象概念,開發者為了實現中斷和繼續等操作,將 user agent 和 server 之間一對一的互動,抽象為“會話”,進而衍生出“會話狀態”,也就是 session 的概念。
而 cookie 是一個實際存在的東西,http 協議中定義在 header 中的欄位。可以認為是 session 的一種後端無狀態實現。
session與記憶體:
我們將session資料直接存在變數session中,它位於記憶體中。然而這些資料放在記憶體中將有極大隱患,如果使用者增多,我們很可能就接觸到了記憶體限制的上限,並且記憶體中的資料量加大,必然會引起垃圾回收的頻繁掃描。
localStorage,sessionStorage和cookie的區別
資料儲存方面
- cookie資料始終在同源的http請求中攜帶(即使不需要),即cookie在瀏覽器和伺服器間來回傳遞。cookie資料還有路徑(path)的概念,可以限制cookie只屬於某個路徑下
- sessionStorage和localStorage不會自動把資料傳送給伺服器,僅在本地儲存。
儲存資料大小
- 儲存大小限制也不同,cookie資料不能超過4K,同時因為每次http請求都會攜帶cookie、所以cookie只適合儲存很小的資料,如會話標識。
- sessionStorage和localStorage雖然也有儲存大小的限制,但比cookie大得多,可以達到5M或更大
資料儲存有效期
- sessionStorage:僅在當前瀏覽器視窗關閉之前有效;
- localStorage:始終有效,視窗或瀏覽器關閉也一直儲存,本地儲存,因此用作持久資料;
- cookie:只在設定的cookie過期時間之前有效,即使視窗關閉或瀏覽器關閉
作用域不同
- sessionStorage不在不同的瀏覽器視窗中共享,即使是同一個頁面;
- localstorage在所有
同源視窗
中都是共享的;也就是說只要瀏覽器不關閉,資料仍然存在 - cookie: 也是在所有
同源視窗
中都是共享的.也就是說只要瀏覽器不關閉,資料仍然存在