隨着Web應用程序出現以來,人們對與可以直接在客戶端上存儲信息能力的要求始終沒有中止過。應用開發人員在找各類方式將數據存儲在客戶端上。從剛開始的Cookie存儲方案,到如今的Web Storage和indexedDB,本文將主要介紹這三種瀏覽器存儲方式優缺點。html
HTTP Cookie
,一般直接叫作cookie
,起初是在客戶端用於存儲會話信息的。該標準要求服務器對 任意 HTTP
請求發送 Set-Cookie
而HTTP
頭做爲響應的一部分,其中包含會話信息。例如,這種服務器響 應的頭可能以下:web
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Other-header: other-header-value
這個 HTTP
響應設置以name
爲名稱、以value
爲值的一個cookie
,名稱和值在傳送時都必須是 URL
編碼的。瀏覽器會存儲這樣的會話信息,並在這以後,經過爲每一個請求添加 Cookie
,HTTP
頭將信 息發送回服務器,以下所示:面試
GET /index.html HTTP/1.1 Cookie: name=value Other-header: other-header-value
發送回服務器的額外信息能夠用於惟一驗證客戶來自於發送的哪一個請求。 數據庫
二、Cookie主要構成:windows
name
(名稱):一個惟一肯定cookie
的名稱。cookie
的名稱必須是通過 URL
編碼的。value
(值):儲存在 cookie
中的字符串值。值必須被 URL
編碼。Domain
(域):cookie
對於哪一個域是有效的。全部向該域發送的請求中都會包含這個 cookie
信息。path
(路徑):對於指定域中的那個路徑,應該向服務器發送 cookie
。Expires/Max-Age
(失效時間):表示 cookie
什麼時候應該被刪除的時間戳(也就是,什麼時候應該中止向服務器發送這個 cookie
)。HttpOnly
:這個屬性是面試的時候常考的,若是這個屬性設置爲true
,就不能經過js
腳原本獲取cookie
的值,能有效的防止xss
攻擊。Secure
(安全標誌):指定後,cookie
只有在使用 SSL
鏈接的時候才發送到服務器。
### 三、Cookie的原理跨域
第一次訪問網站的時候,瀏覽器發出請求,服務器響應請求後,會在響應頭裏面添加一個Set-Cookie
,將cookie
放入到響應請求中,在瀏覽器第二次發請求的時候,會經過Cookie
請求頭部將Cookie
信息發送給服務器,服務端會辨別用戶身份,另外,Cookie
的過時時間、域、路徑、有效期、適用站點均可以根據須要來指定。瀏覽器
Cookie的生成方式主要有兩種:緩存
客戶端第一次向服務端請求時,在相應的請求頭中就有set-cookie
字段,用來標識是哪一個用戶。安全
下圖爲登陸騰訊雲服務端響應頭截圖,cookie
設置了相關的屬性:expires
、path
等。response headers
服務端能夠設置cookie
的全部選項:expires
、domain
、path
、secure
、HttpOnly
。服務器
cookie
不像web Storage
有setItem
,getItem
,removeItem
,clear
等方法,須要本身封裝。簡單地在瀏覽器的控制檯裏輸入:
document.cookie="name=lynnshen; age=18"
最簡單的設置多個cookie
的方法就是重複執行document.cookie = "key=name"
document.cookie = "name=lynnshen"; document.cookie = "age=18";
再看控制檯:
function setCookie(name, value, expires, path, domain, secure) { var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value); if (expires instanceof Date) { cookieText += "; expires=" + expires.toGMTString(); } if (path) { cookieText += "; path=" + path; } if (domain) { cookieText += "; domain=" + domain; } if (secure) { cookieText += "; secure"; } document.cookie = cookieText; }
function removeCookie(name, path, domain, secure){ this.set(name, "", new Date(0), path, domain, secure); }
function getCookie(name){ var cookieName = encodeURIComponent(name) + "="; var cookieStart = document.cookie.indexOf(cookieName); var cookieValue = null; if (cookieStart > -1){ var cookieEnd = document.cookie.indexOf(";", cookieStart); if (cookieEnd == -1){ cookieEnd = document.cookie.length; } cookieValue = decodeURIComponent(document.cookie.substring( cookieStart + cookieName.length, cookieEnd)); } return cookieValue; }
每一個特定域名下的cookie數量有限:
當超過單個域名限制以後,再設置cookie
,瀏覽器就會清除之前設置的cookie
。IE
和Opera
會清理近期最少使用的cookie
,FF
會隨機清理cookie
。
4KB
。HTTP
請求都會發送到服務端,影響獲取資源的效率。cookie
的方法。最初的Web Storage
規範包含了兩種對象的定義:sessionStorage
和globalStorage
。這兩個對象在支持的瀏覽器中都是以windows
對象屬性的形式存在的。而localStorage
對象在修訂過的HTML 5
規範中做爲持久保存客戶端數據的方案取代了globalStorage
。因此如今主要談論的是sessionStorage
和localStorage
兩種。
一、web Storage的主要做用:
cookie
以外存儲會話數據的途徑;二、web Storage 的主要方法:
clear()
: 刪除全部值;Firefox
中沒有實現 。getItem(name)
:根據指定的名字 name
獲取對應的值。key(index)
:得到 index
位置處的值的名字。removeItem(name)
:刪除由 name
指定的名值對兒。注意: Storage 類型只能存儲字符串。非字符串的數據在存儲以前會被轉換成字符串。
一、localStorage的特色
基於上面的特色,LocalStorage能夠做爲瀏覽器本地緩存方案,用來提高網頁首屏渲染速度(根據第一請求返回時,將一些不變信息直接存儲在本地)。
二、localStorage的使用
//使用方法存儲數據 localStorage.setItem("name", "Nicholas"); //使用屬性存儲數據 localStorage.book = "Professional JavaScript"; //使用方法讀取數據 var name = localStorage.getItem("name"); //使用屬性讀取數據 var book = localStorage.book;
數據的保留是經過 JavaScript
刪除或者是用戶清除瀏覽器緩存。
一、什麼是 sessionStorage ?
sessionStorage
對象存儲特定於某個會話的數據,也就是該數據只保持到瀏覽器關閉。sessionStorage
就像會話 cookie
,也會在瀏覽器關閉後消失。sessionStorage
中的數據能夠跨越頁面刷新而存在,同時若是瀏覽器支持,瀏覽器崩潰並重啓以後依然可用(Firefox 和 WebKit都支持,IE則不行)。seesionStorage
對象綁定於某個服務器會話,因此當文件在本地運行的時候是不可用的。sessionStorage
中的數據只能由最初給對象存儲數據的頁面訪問到,因此對多頁面應用有限制。二、sessionStorage的特色:
基於上面的特色,sessionStorage
能夠有效對錶單信息進行維護,好比刷新時,表單信息不丟失。
三、localStorage 的使用
//使用方法存儲數據 sessionStorage.setItem("name", "Nicholas"); //使用屬性存儲數據 sessionStorage.book = "Professional JavaScript"; //使用方法讀取數據 var name = sessionStorage.getItem("name"); //使用屬性讀取數據 var book = sessionStorage.book;
sessionStorage
對象應該主要用於僅針對會話的小段數據的存儲。若是須要跨越會話存儲數據, 那麼localStorage
更爲合適。
一、IndexedDB 是什麼?
Indexed Database API
,或者簡稱爲IndexedDB
,是在瀏覽器中保存結構化數據的一種數據庫。IndexedDB
的思想是建立一套 API
,方便保存和讀取 JavaScript
對象,同時還支持查詢及搜索。
二、IndexedDB 的特色
鍵值對儲存
:IndexedDB
內部採用對象倉庫(object store)存放數據。全部類型的數據均可以直接存入,包括JavaScript
對象。對象倉庫中,數據以"鍵值對"的形式保存,每個數據記錄都有對應的主鍵,主鍵是獨一無二的,不能有重複,不然會拋出一個錯誤。異步
:IndexedDB
操做時不會鎖死瀏覽器,用戶依然能夠進行其餘操做,這與 LocalStorage
造成對比,後者的操做是同步的。異步設計是爲了防止大量數據的讀寫,拖慢網頁的表現。支持事務
: IndexedDB
支持事務(transaction),這意味着一系列操做步驟之中,只要有一步失敗,整個事務就都取消,數據庫回滾到事務發生以前的狀態,不存在只改寫一部分數據的狀況。同源限制
: IndexedDB
受到同源限制,每個數據庫對應建立它的域名。網頁只能訪問自身域名下的數據庫,而不能訪問跨域的數據庫。儲存空間大
: IndexedDB
的儲存空間比 localStorage
大得多,通常來講很多於 250MB,甚至沒有上限。-支持二進制儲存
: IndexedDB
不只能夠儲存字符串,還能夠儲存二進制數據(ArrayBuffer 對象和 Blob 對象)。
三、IndexedDB 基本指令
window.indexedDB.open("testDB")
indexdb.close()
window.indexedDB.deleteDatabase(indexdb)
四、webStorage、cookie 和 IndexedDB之間的區別
從上圖能夠看到,cookie
已經不建議用於存儲。若是沒有大量數據存儲需求的話,可使用 localStorage
和 sessionStorage
。對於不怎麼改變的數據儘可能使用 localStorage
存儲,不然能夠用 sessionStorage
存儲。
web存儲能夠說是必需要重點理解和掌握的知識點了,特別是web Storage常常會使用到。最後總結用一句話總結三種存儲方案。