天天看點

前端面試:資料存儲Cookie、SessionStorage、LocalStorage知多少

作者:尚矽谷教育

在前端開發中,往往會将有些不經常更改的資料緩存到本地,比如使用者資訊。前端本地緩存的方式有多種,比如SessionStorage、localStorage 以及 cookies 等。那麼這個幾個緩存有什麼差別,各自又有什麼特點呢?将是本文分享的重點。

一、cookie

1. cookie是什麼

網絡早期最大的問題之一是如何管理狀态。簡而言之,伺服器無法知道兩個請求是否來自同一個浏覽器。當時最簡單的方法是在請求時,在頁面中插入一些參數,并在下一個請求中傳回參數。這需要使用包含參數的隐藏的表單,或者作為URL參數的一部分傳遞。這兩個解決方案都手動操作,容易出錯。cookie出現來解決這個問題。

2. cookie原理

第一次通路網站,浏覽器會發送一個請求,伺服器響應這個請求,會将cookie放進響應體中。

第二次通路網站,浏覽器發送的請求帶有cookie,伺服器會辨識這個使用者的身份。

前端面試:資料存儲Cookie、SessionStorage、LocalStorage知多少

2. cookie的屬性

前端面試:資料存儲Cookie、SessionStorage、LocalStorage知多少

(1)Name:cookie的名字,一個域名下綁定的cookie的name不能相同。如果是相同的name則會被覆寫。

(2)value:每個cookie擁有的屬性,表示cookie的值。

(3)domain:cookie的域名。cookie綁定的域名,如果沒有設定,自動綁定目前執行語句的的域。同一個域名下的二級域名也是不可以交換cookie的。

(4)path:path是預設屬性’/',比對web路由。

(5)Expires:expires是cookie的有效期。一般浏覽器的cookie是預設存儲的,關閉浏覽器結束會話,cookie就會被删除。

如果想要cookie續存一段時間,可以通過設定expires有效期。

expires現在被Max-Age取代:Max-Age,是以秒為機關的,Max-Age為正數時,cookie會在Max-Age秒之後,被删除;當Max-Age為負數時,表示的是臨時儲存,不會生出cookie檔案,隻會存在浏覽器記憶體中,且隻會在打開的浏覽器視窗或者子視窗有效,一旦浏覽器關閉,cookie就會消失;當Max-Age為0時,删除cookie,因為cookie機制本身沒有設定删除cookie,失效的cookie會被浏覽器自動從記憶體中删除,是以,它實作的就是讓cookie失效。

(6)secure:安全。http無狀态無加密,不安全協定容易被攻擊挾持。比如你在浏覽頁面的時候是不是會有小廣告出來。這個secure屬性為true的時候,這個時候的cookie隻會在https和ssl等安全協定下傳輸。不能對cookie加密,絕對安全保證做不到。

(7)httpOnly:安全的 Cookie 需要經過 HTTPS 協定通過加密的方式發送到伺服器。即使是安全的,也不應該将敏感資訊存儲在cookie 中,因為它們本質上是不安全的,并且此标志不能提供真正的保護。

3. cookie兩種類型—會話cookie和永久性cookie

(1)一種是Session Cookies:用戶端關閉,資料删除,永久丢失。沒有指定的Expires/Max-Age指令,存儲在記憶體。

(2)一種是Persistent Cookies:用戶端關閉,資料不會删除。當Expires或者Max-Age過期,才會删除資料,存儲在磁盤。

4.cookie的缺點

  • 存儲大小有限最大4KB
  • http請求時會自動發送給伺服器, 增加了請求的資料量
  • 原生的操作文法不太友善操作cookie
  • 浏覽器可以設定禁用

二、SessionStorage

SessionStorage 顧名思義就是存在與會話階段,當會話結束時,SessionStorage 存儲的資料即會失效。那麼關鍵來了什麼才表示會話結束?其實在浏覽器中一個活動标簽頁即代表一個會話Session,如果目前标簽頁被關掉即代表,目前會話結束,此時目前 SessionStorage 中存儲的資料就會被浏覽器自動銷毀。

1.SessionStorage的用法

sessionStorage.setItem(key,value):存儲資料,接收2個參數,一個是 key,一個是 value。

sessionStorage.getItem(key):擷取資料,接收1個參數,參數為 key,可擷取 value。

sessionStorage.removeItem(key):移除指定資料,接收1個參數,參數為 key,移除相應的 value。

sessionStorage.clear():移除所有資料,無參數。

//存儲緩存資料

sessionStorage.setItem("name", "jack");

sessionStorage.setItem("age", 18);

//擷取緩存資料

var name = sessionStorage.getItem("name");

var age = sessionStorage.getItem("age");

console.log(name)//"jack"

console.log(age)//18

//移除指定緩存

// sessionStorage.removeItem("name");//移除name緩存

//移除所有緩存

// sessionStorage.clear(); 移除所有緩存

// 擷取引用類型

//存儲緩存資料

sessionStorage.setItem("data", JSON.stringify({ name: "jack", age: 18 }));

// 擷取緩存資料

var data = JSON.parse(sessionStorage.getItem("data"));

console.log(data)//{name:"jack",age:18};

前端面試:資料存儲Cookie、SessionStorage、LocalStorage知多少

2.SessionStorage失效時間

sessionStorage的生命周期僅在目前會話有效。sessionStorage引入了“浏覽器視窗的概念”。sessionStorage在同源視窗中始終存在資料,隻要浏覽器視窗沒有關閉,重新整理或者重新進入頁面資料依然存在。關閉浏覽器視窗後資料會被删除。再次獨立打開同一個視窗同一個頁面,sessionStorage也是不一樣。

3.SessionStorage存儲的位置

sessionStorage都儲存在用戶端,一般不與伺服器進行通信互動。

4.SessionStorage存儲的大小

sessionStorage存儲資料大小一般是5MB

三、localStorage

localStorage理論上來說是永久有效的,即不主動清空的話就不會消失,即使儲存的資料超出了浏覽器所規定的大小,也不會把舊資料清空而隻會報錯。但需要注意的是,在移動裝置上的浏覽器或各Native App用到的WebView裡,localStorage都是不可靠的,可能會因為各種原因(比如說退出App、網絡切換、記憶體不足等原因)被清空。

1.localStorage的用法

localStorage.setItem(key,value):存儲資料,接收2個參數,一個是 key,一個是 value。

localStorage.getItem(key):擷取資料,接收1個參數,參數為 key,可擷取 value。

localStorage.removeItem(key):移除指定資料,接收1個參數,參數為 key,移除相應的 value。

localStorage.clear():移除所有資料,無參數。

//存儲緩存資料

localStorage.setItem("name", "jack");

localStorage.setItem("age", 18);

//擷取緩存資料

var name = localStorage.getItem("name");

var age = localStorage.getItem("age");

console.log(name)//"jack"

console.log(age)//18

//移除指定緩存

// localStorage.removeItem("name");//移除name緩存

//移除所有緩存

// localStorage.clear(); 移除所有緩存

//存儲緩存資料

localStorage.setItem("data", JSON.stringify({ name: "jack", age: 18 }));

//擷取緩存資料

var data = JSON.parse(localStorage.getItem("data"));

console.log(data)//{name:"jack",age:18};

前端面試:資料存儲Cookie、SessionStorage、LocalStorage知多少

2.localStorage的失效時間

localStorage的生命周期是永久的,關閉頁面或者浏覽器之後localStorage中的資料也不會消失。localStorage删除資料要手動删除,否則資料永遠不會消失。

3.localStorage存儲的位置

localStorage都儲存在用戶端,一般不與伺服器進行通信互動。

4.localStorage存儲的大小

localStorage存儲資料大小一般是5MB

四、localStorage與sessionStorage差別

1.相同點

  • 純浏覽器端存儲, 存儲空間在 2.5M 到 10M 之間(各浏覽器不同), 請求時不會自動攜帶
  • 隻能儲存文本, 如果是對象或數組, 需要轉換為JSON

2.不同點

  • localStorage儲存在本地檔案中, 除非編碼或手動删除, 否則一直存在
  • sessonStorage資料儲存在目前會話記憶體中, 關閉浏覽器則清除

五、cookie與其他兩種的差別

  • 存儲的容量大小,cookie最大隻有4KB
  • 請求時是否自動攜帶
  • API的易用性

六、總結

Cookie、SessionStorage、 LocalStorage都是浏覽器的本地存儲。它們的共同點:都是存儲在浏覽器本地的。它們的差別:cookie是由伺服器端寫入的,而SessionStorage、 LocalStorage都是由前端寫入的,cookie的生命周期是由伺服器端在寫入的時候就設定好的,LocalStorage是寫入就一直存在,除非手動清除,SessionStorage是頁面關閉的時候就會自動清除。cookie的存儲空間比較小大概4KB,SessionStorage、 LocalStorage存儲空間比較大,大概5M。Cookie、SessionStorage、 LocalStorage資料共享都遵循同源原則,SessionStorage還限制必須是同一個頁面。在前端給後端發送請求的時候會自動攜帶Cookie中的資料,但是SessionStorage、 LocalStorage不會。

由于它們的以上差別,是以它們的應用場景也不同,Cookie一般用于存儲登入驗證資訊SessionID或者token,LocalStorage常用于存儲不易變動的資料,減輕伺服器的壓力,SessionStorage可以用來檢測使用者是否是重新整理進入頁面,如音樂播放器恢複播放進度條的功能。