Local Storage,Session Storage,IndexedDB,Web SQL,Cookies簡介

一 概述

Local  Storage,Session Storage,IndexedDB,Web SQL,Cookies都是瀏覽器中具有實現前端本地存儲功能的介質。在HTML5本地存儲——Web SQL Database提到過Web SQL Database實際上已經被廢棄,而HTML5的支持的本地存儲實際上變成了Web Storage(Local Storage和Session Storage)與IndexedDB。Web Storage使用簡單字符串鍵值對在本地存儲數據,方便靈活,但是對於大量結構化數據存儲比較難處理,IndexedDB是爲了能夠在客戶端存儲大量的結構化數據,並且使用索引高效檢索的API。

二 Cookie

Cookie數據始終在同源的Http請求中攜帶(即使不需要),在HttpRequest和HttpResponse的Header中實現瀏覽器和服務器間來回傳遞,最後保存在客戶端,這樣需要佔用一些流量,同時Cookie數據還有path屬性,可以限制Cookie只屬於該路徑下,且Cookie大小不能超過4k,所以Cookie只是適合保存較小的數據,如回話標識,用戶登錄信息,網站記住密碼的功能通常是通過在Cookie中保存一段辨別用戶身份的數據來實現。值得注意的是由於Cookie在Http協議請求中是以明文方式傳遞的(Https協議請求中不是),所以存在一定的安全性問題。此外Cookie只在設置的過期時間之前有效,即使窗口或者瀏覽器關閉,此外在所有同源的瀏覽器窗口可以實現Cookie的共享。

三 Local Storage&Session Storage

Local Storage與Session Storage是Web Storage提供的兩種API,是HTML5中新增的本地同源存儲解決方案之一,都是一種前端客戶端本地存儲慨念。

Local Storage是可以永久保存在瀏覽器本地,即使瀏覽器窗口或者瀏覽器關閉也不會被清除,除非顯式的清除,所以用作客戶端持久化數據,同時數據可以在所有同源窗口進行共享。其中數據不參與和服務器之間的通信,一般可以保存5M大小的數據。

Session Storage是會話級別的存儲,用於本地存儲會話(session)數據,且存儲的數據只是在當前瀏覽器窗口的同一個會話頁面有效,會話結束後數據也會隨之銷燬,所以不能進行持久化存儲,且數據不會在瀏覽器窗口進行共享,即使是不同窗口的相同頁面。其中數據不參與和服務器之間的通信,一般可以保存5M大小的數據。

四 Cookie&Local Storage&Session Storage之間比較

特性 Cookie Local Storage Session Storage
數據的生命期 可設置失效時間,默認是關閉瀏覽器後失效 除非被顯式清除,否則永久保存 會話級存儲,僅在當前會話下有效,會話結束,關閉頁面或瀏覽器後被清除
存放數據大小 4KB左右 5MB~10MB(瀏覽器不同,情況不同) 5MB~10MB(瀏覽器不同,情況不同)
與服務器端通信 每次都會攜帶在HTTP頭中,如果使用cookie保存過多數據會帶來性能和安全問題 僅在客戶端(即瀏覽器)中保存,不參與和服務器的通信 僅在客戶端(即瀏覽器)中保存,不參與和服務器的通信
易用性 源生的Cookie接口不友好,開發者需要根據需求封裝 源生接口良好,亦可再次封裝來對Object和Array有更好的支持 源生接口良好,亦可再次封裝來對Object和Array有更好的支持
應用場景 用戶登錄時,保存服務器返回的一段加密過的唯一辨識單一用戶的code,用以判斷當前用戶登錄狀態,或者之前電商網站用來保存用戶的購物車信息。 Local Storage可以替代Cookie完成用戶購物車信息的前端保存功能,同時可以當作HTML5遊戲的本地數據的存儲空間。 當頁面存在多表單的情況下,可以利用Session Storage實現表單頁拆分,優化用戶體驗。
注意 不要將系統敏感的數據保存到Cookie,Local Storage,Session Storage中,防止XSS注入的風險。因爲XSS注入可以通過控制檯對你的屬性值進行修改。

五 IndexedDB

如Cookies,Local Storage,Session Storage都是瀏覽器端的數據存儲方案,但是不適合大量數據的存儲,而且不提供搜索功能,不能建立自定的索引。而IndexedDB就是瀏覽器提供的本地數據庫,它可以被網頁腳本創建和操作。它可以存儲大量數據,提供了查找接口,能夠建立索引。但是不屬於關係型數據庫(不支持SQL查詢語句,更類似於NoSQL數據庫)。

IndexedDB的特點:

  1. 鍵值對存儲:IndexedDB內部採用對象倉庫(object store)存放數據。所有類型的數據都可以直接存入,包括JavaScript對象。對象倉庫中,數據以“鍵值對”的形式保存。每一個數據記錄都有對應的主鍵,主鍵是唯一的,如果重複會拋出一個錯誤。
  2. 異步:IndexedDB操作不會鎖死瀏覽器,用戶依然可以進行其他操作,與Local Storage的同步操作不同,異步的設計是爲了大量數據的讀寫,拖慢頁面的表現,降低用戶體驗。
  3. 支持事務:IndexedDB支持事務(transaction),這意味着一些列操作步驟中,只要有某個步驟出現異常,則整個事務就會消失,數據庫回滾到事務發生之前的狀態,不存在只寫一部分數據的情況。
  4. 同源限制:IndexedDB受到同源限制,每一個數據庫對應創建它的域名。網頁只能訪問自身域名下的數據庫,而不能夠訪問跨域的IndexedDB數據庫。
  5. 存儲空間大:IndexedDB的存儲空間一般不少於250MB,或者更大。
  6. 支持二進制存儲:IndexedDB不僅可以儲存字符串,還可以儲存二進制數據(ArrayBuffer對象和Blob對象)。

參考資料:瀏覽器數據庫IndexedDB入門教程

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