摘要:盡管瀏覽器對(duì)進(jìn)行了大小限制,不過(guò)最好還是盡可能在中少存儲(chǔ)信息,以避免影響性能。的性質(zhì)和局限性使其并不能作為存儲(chǔ)大量信息的理想手段。
Cookie
HTTP Cookie, 通常直接叫做cookie,最初是在客戶端用于存儲(chǔ)會(huì)話信息的。該標(biāo)準(zhǔn)要求服務(wù)器對(duì)任意HTTP請(qǐng)求發(fā)送Set-Cookie HTTP頭作為響應(yīng)的一部分,其中包含會(huì)話信息。這個(gè)HTTP響應(yīng)設(shè)置一個(gè)以name為名稱(chēng)、以value為值的cookie,名稱(chēng)和值在傳送時(shí)都必須是URI編碼的。瀏覽器會(huì)存儲(chǔ)這樣的會(huì)話信息,并在這之后,通過(guò)為每個(gè)請(qǐng)求添加Cookie HTTP頭將信息發(fā)送回服務(wù)器,發(fā)送回服務(wù)器的額外信息可以用于唯一驗(yàn)證客戶端來(lái)自于發(fā)送的哪個(gè)請(qǐng)求。
Cookie的限制 安全性限制cookie在性質(zhì)上是綁定在特定的域名下的。當(dāng)設(shè)定了一個(gè)cookie后,再給創(chuàng)建它的域名發(fā)送請(qǐng)求時(shí),都會(huì)包含這個(gè)cookie。這個(gè)限制確保了存儲(chǔ)在cookie中的信息只能讓批準(zhǔn)的接受者訪問(wèn),而無(wú)法被其他域訪問(wèn)。
數(shù)量限制IE6及更低的版本每個(gè)域名限制為20個(gè)cookie,IE7及以后的版本每個(gè)域名限制為50個(gè)cookie。
Firefox每個(gè)域名cookie限制為50個(gè)。
Opera每個(gè)域名cookie限制為30個(gè)。
Safari和Chrome對(duì)每個(gè)域的cookie的數(shù)量限制沒(méi)有硬性規(guī)定
大小限制大多數(shù)瀏覽器對(duì)每個(gè)cookie有大約4096B的長(zhǎng)度限制(大約4K)
cookie的構(gòu)成cookie由瀏覽器保存的以下幾塊信息構(gòu)成
名稱(chēng)
值
域:cookie對(duì)哪個(gè)域是有效的,所有向該域發(fā)送的請(qǐng)求中都會(huì)包含這個(gè)cookie信息,默認(rèn)值為設(shè)置cookie的那個(gè)域
路徑:指定域中的哪個(gè)路徑,應(yīng)該向服務(wù)器發(fā)送cookie。例如指定該值為http://www.example.com/test1/,則只有該路徑下的請(qǐng)求會(huì)包含這個(gè)cookie
失效時(shí)間: cookie何時(shí)應(yīng)該被刪除的時(shí)間戳
安全標(biāo)志: 指定后,cookie只有在使用SSL連接時(shí),才會(huì)發(fā)送到服務(wù)器
尤其要注意,域、路徑、失效時(shí)間、安全標(biāo)志都是服務(wù)器給瀏覽器的標(biāo)識(shí),這些參數(shù)并不會(huì)作為發(fā)送到服務(wù)器的cookie信息的一部分,只有鍵值對(duì)才會(huì)被發(fā)送。
JavaScript對(duì)cookie的操作使用document.cookie可以獲取當(dāng)前頁(yè)面可用的所有的cookie組成的字符串,該字符串是有分號(hào)隔開(kāi)的鍵值對(duì)構(gòu)成(由分號(hào)隔開(kāi)的一個(gè)鍵值對(duì)就是一個(gè)cookie),例如:name1=value1;name2=value2;name3=value3。所有名字和值都是經(jīng)過(guò)URL編碼,所以必須使用decodeURIComponent()來(lái)解碼。
當(dāng)document.cookie用于設(shè)置值的時(shí)候,document.cookie屬性可以設(shè)置為一個(gè)新的字符串,這個(gè)cookie字符串會(huì)被解釋并添加到現(xiàn)有的cookie集合中。設(shè)置document.cookie并不會(huì)覆蓋cookie,除非設(shè)置的cookie的名稱(chēng)已經(jīng)存在
var CookieUtil = { get: function(name){ var cookieName = encodeURIComponent(name) + "=", cookieStart = document.cookie.indexOf(cookieName), cookieValue = null; if(cookieStart > -1){ cookieEnd = document.cookie.indexOf(";", cookieStart); if(cookieEnd == -1){ cookieEnd = document.cookie.length; } cookieValue = decodeURIComponent(document.cookie.substring(cookieStart+cookieName.length, cookieEnd)); } return cookieValue; }, set: function(name, value, expires, path, domain, secure){ // 設(shè)置的cookie的名稱(chēng)已存在,將會(huì)覆蓋原有的cookie 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=" + secure; } document.cookie = cookieText; }, // 刪除已有cookie unset: function(name, path, domain, secure){ this.set(name, "", new Date(), path, domain, secure); } }子cookie
為了繞開(kāi)瀏覽器的單域名下的cookie數(shù)量限制,可以在每個(gè)cookie中存放多個(gè)更小的字段(子cookie)。子cookie最常見(jiàn)的格式如下:
"name=name1=value1&name2=value2&name3=value3"
子cookie一般也以查詢字符串的格式進(jìn)行格式化。然后這些值可以使用單個(gè)cookie進(jìn)行存儲(chǔ)和訪問(wèn),而非對(duì)每個(gè)鍵值對(duì)使用不同的cookie存儲(chǔ)。最后網(wǎng)站或web應(yīng)用程序可以無(wú)需達(dá)到單域名cookie上限也可以存儲(chǔ)更加結(jié)構(gòu)化的數(shù)據(jù)。為了更好地操作子cookie,必須建立一系列新方法。子cookie的解析和序列化會(huì)因子cookie的期望用途而略有不同并更加復(fù)雜些。
var SubCookieUtil = { get: function(name, subName){ var subCookies = this.getAll(name) if(subCookies){ return subCookies[subName]; } else { return null; } }, getAll: function(name){ var cookieName = encodeURIComponent(name) + "=", cookieStart = document.cookie.indexOf(cookieName), cookieValue = null, cookieEnd, subCookie, i, parts, result = {}; if(cookeStart > -1){ cookieEnd = document.cookie.indexOf(";", cookieStart); if(cookieEnd == -1){ cookieEnd = document.cookie.length; } cookieValue = document.cookie.substring(cookieStart+cookieName.length, cookieEnd); if(cookieValue.length>0){ subCookies = cookieValue.split("&"); for(i=0, len=subCookies.length; i關(guān)于cookie的思考0 && subcookies.hasOwnProperty(subName)){ subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]); } } if(cookieParts.length >0){ cookieText += subcookieParts.join("&"); if(expires instanceof Date){ cookieText += "; expires=" + expires.toGMTSting(); } if(path){ cookieText += "; path=" + path; } if(domain){ cookieText += "; domain=" + domain; } if(secure){ cookieText += "; secure=" + secure; } } else { cookieText += "; expires="+(newDate(0)).toGMTString(); } document.cookie = cookieText; }, unset: function(name, subName, path, domain, secure){ var subcookies = this.getAll(name); if(subcookies){ delete subcookies[subName]; this.set(name, subcookies, null, path, domain, secure); } }, unsetAll: function(name, path, domain, secure){ this.setAll(name, null, new Date(0), path, domain, secure); } };
操作cookie的時(shí)候需要密切關(guān)注cookie的長(zhǎng)度,以防超過(guò)單個(gè)cookie的長(zhǎng)度限制
所有的cookie都會(huì)由瀏覽器作為請(qǐng)求內(nèi)容的一部分發(fā)送,所以在cookie中存儲(chǔ)大量信息會(huì)影響到特定域的請(qǐng)求性能。cookie越大,完成對(duì)服務(wù)器請(qǐng)求的時(shí)間就越長(zhǎng)。盡管瀏覽器對(duì)cookie進(jìn)行了大小限制,不過(guò)最好還是盡可能在cookie中少存儲(chǔ)信息,以避免影響性能。
cookie的性質(zhì)和局限性使其并不能作為存儲(chǔ)大量信息的理想手段。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83556.html
閱讀 3517·2021-11-18 10:07
閱讀 1614·2021-11-04 16:08
閱讀 1564·2021-11-02 14:43
閱讀 1122·2021-10-09 09:59
閱讀 879·2021-09-08 10:43
閱讀 1147·2021-09-07 09:59
閱讀 1004·2019-12-27 11:56
閱讀 1084·2019-08-30 15:56