屬於某個特定用戶的信息應該存在該用戶的機器上,無論是登錄信息、偏好設定或其他數據,這是一個很重要的用戶體驗,它避免了用戶重復多次的簡單操作。
cookie 是原來的網景公司創造的。一份題為“Persistent Client State: HTTP Cookes”(持久客戶端狀態: HTTP Cookies ) 的標准中對cookie 機制進行了闡述。
cookie標准要求服務器對任意HTTP 請求發送Set-Cookie HTTP 頭作為響應的一部分,其中包含會話信息
過程:
1.設置cookie,發送至服務器端;
2.服務器對該請求發送帶有Set-Cookie
的HTTP響應給浏覽器;
3.浏覽器會存儲這樣的會話信息,並在這之後,通過為每個請求添加Cookie HTTP 頭將信息發送回服務器
cookie的限制
cookie的構成
比如:
Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com;secure
name = value
[必須參數]; 名值對,不區分大小寫,必須是URL 編碼domain
設定cookie的有效域,所有向該域發送的請求中都會包含這個cookie 信息path
指定cookie在有效域中的有效路徑,即使請求都是來自同一個域的,不是該鍵制定的路徑,也不會發送cookieexpires
表示cookie 何時應該被刪除的時間戳(這個值是個GMT 格式的日期),默認情況下,浏覽器會話結束時即將所有cookie 刪除secure
指定後,cookie 只有在使用SSL 連接的時候才發送到服務器js處理cookie
document.cookie
返回當前頁面可用的所有cookie的字符串,一系列由分號隔開的名值對兒。
cookie的操作無非是獲取、設置和刪除,我們把這三種方法封裝在一個var CookieUtil = {}
對象中。分別對應其get,set,unset屬性。
cookie的name和value都是經過URL 編碼的,所以必須使用encodeURIComponent,decodeURIComponent()來編解碼。
1.get
get: function (name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
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;
}
2.set
set: function (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;
}
3.unset
unset: function (name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
子cookie
子cookie可以繞開浏覽器的單域名下的cookie 數限制。子cookie 是存放在單個cookie 中的更小段的數據。也就是使用cookie 值來存儲多個名稱值對,如:name=name1=value1&name2=value2&name3=value3&name4=value4&name5=value5
所有的cookie 都會由浏覽器作為請求頭發送,所以在cookie 中存儲大量信息會影響到特定域的請求性能。cookie 信息越大,完成對服務器請求的時間也就越長。盡管浏覽器對cookie 進行了大小限制,不過最好還是盡可能在cookie 中少存儲信息,以避免影響性能
在IE5.0 中,微軟通過一個自定義行為引入了持久化用戶數據的概念。用戶數據允許每個文檔最多
128KB 數據,每個域名最多1MB 數據。
使用:
使用CSS 在某個元素上指定userData 行為:
<div style="behavior:url(#default#userData)" id="dataStore"></div>
使用setAttribute()方法在上面保存數據
dataStore.setAttribute("name", "Nicholas");
調用save()方法保存數據,參數為數據空間名字,數據空間名字可以完全任意,僅用於區分不同的數據集
dataStore.save("BookInfo");
使用load()方法來獲取數據,參數為數據空間名字
dataStore.load("BookInfo");
使用removeAttribute()刪除數據,並使用save()保存修改
dataStore.removeAttribute("name");
dataStore.save("BookInfo");
限制
用戶數據默認是可以跨越會話持久存在的,不會過期;數據需要通過removeAttribute()方法專門進行刪除以釋放空間。
Web Storage 的目的是克服由cookie 帶來的一些限制,提供一種存儲大量可以跨會話的在cookie 之外的存儲會話數據的途徑。
Storage對象(以windows 對象屬性的形式存在)
sessionStorage對象
存儲特定於某個會話的數據,該數據只保持到浏覽器關閉
globalStorage對象
這個對象可以跨越會話存儲數據,但有特定的訪問限制。要使用globalStorage,首先要指定哪些域可以訪問該數據。可以通過方括號標記使用屬性來實現。如果不使用removeItem() 或者delete 刪除該對象, 或者用戶未清除浏覽器緩存, 存儲在globalStorage 屬性中的數據會一直保留在磁盤上。這讓globalStorage 非常適合在客戶端存儲文檔或者長期保存用戶偏好設置。
localStorage對象
該對象在修訂過的HTML 5 規范中作為持久保存客戶端數據的方案取代了globalStorage。與globalStorage 不同,不能給localStorage 指定任何訪問規則;規則事先就設定好了。要訪問同一個localStorage 對象,頁面必須來自同一個域名(子域名無效),使用同一種協議,在同一個端口上。這相當於globalStorage[location.host]。
同globalStorage對象一樣,localStorage對象數據保留到通過JavaScript 刪除或者是用戶清除浏覽器緩存。
浏覽器支持:
IE8+、Firefox 3.5+、Chrome 4+和Opera 10.5+
Storage對象方法:
Storage 類型只能存儲字符串。非字符串的數據在存儲之前會被轉換成字符串。
Storage對象事件
對Storage 對象進行任何修改,都會在文檔上觸發storage 事件。這個事件的event 對象有以下屬性:
數據操作
存儲數據:
//使用屬性存儲數據
sessionStorage/globalStorage["www.wrox.com"]/localStorage.name = "brand";
//使用方法存儲數據
sessionStorage/globalStorage["www.wrox.com"]/localStorage.setItem("name","brand");
讀取數據:
//使用屬性存儲數據
var name = sessionStorage/globalStorage["www.wrox.com"]/localStorage.name;
//使用方法存儲數據
var name = sessionStorage/globalStorage["www.wrox.com"]/localStorage.getItem(("name","brand");
刪除數據:
sessionStorage/globalStorage["www.wrox.com"]/localStorage.removeItem("name")
限制
每個來源都有固定大小的空間用於保存自己的數據,一般限制在2.5M—5M左右。
參考書籍:《javascript高級程序設計》