摘要:盡管瀏覽器對進行了大小限制,不過最好還是盡可能在中少存儲信息,以避免影響性能。的性質和局限性使其并不能作為存儲大量信息的理想手段。
Cookie
HTTP Cookie, 通常直接叫做cookie,最初是在客戶端用于存儲會話信息的。該標準要求服務器對任意HTTP請求發送Set-Cookie HTTP頭作為響應的一部分,其中包含會話信息。這個HTTP響應設置一個以name為名稱、以value為值的cookie,名稱和值在傳送時都必須是URI編碼的。瀏覽器會存儲這樣的會話信息,并在這之后,通過為每個請求添加Cookie HTTP頭將信息發送回服務器,發送回服務器的額外信息可以用于唯一驗證客戶端來自于發送的哪個請求。
Cookie的限制 安全性限制cookie在性質上是綁定在特定的域名下的。當設定了一個cookie后,再給創建它的域名發送請求時,都會包含這個cookie。這個限制確保了存儲在cookie中的信息只能讓批準的接受者訪問,而無法被其他域訪問。
數量限制IE6及更低的版本每個域名限制為20個cookie,IE7及以后的版本每個域名限制為50個cookie。
Firefox每個域名cookie限制為50個。
Opera每個域名cookie限制為30個。
Safari和Chrome對每個域的cookie的數量限制沒有硬性規定
大小限制大多數瀏覽器對每個cookie有大約4096B的長度限制(大約4K)
cookie的構成cookie由瀏覽器保存的以下幾塊信息構成
名稱
值
域:cookie對哪個域是有效的,所有向該域發送的請求中都會包含這個cookie信息,默認值為設置cookie的那個域
路徑:指定域中的哪個路徑,應該向服務器發送cookie。例如指定該值為http://www.example.com/test1/,則只有該路徑下的請求會包含這個cookie
失效時間: cookie何時應該被刪除的時間戳
安全標志: 指定后,cookie只有在使用SSL連接時,才會發送到服務器
尤其要注意,域、路徑、失效時間、安全標志都是服務器給瀏覽器的標識,這些參數并不會作為發送到服務器的cookie信息的一部分,只有鍵值對才會被發送。
JavaScript對cookie的操作使用document.cookie可以獲取當前頁面可用的所有的cookie組成的字符串,該字符串是有分號隔開的鍵值對構成(由分號隔開的一個鍵值對就是一個cookie),例如:name1=value1;name2=value2;name3=value3。所有名字和值都是經過URL編碼,所以必須使用decodeURIComponent()來解碼。
當document.cookie用于設置值的時候,document.cookie屬性可以設置為一個新的字符串,這個cookie字符串會被解釋并添加到現有的cookie集合中。設置document.cookie并不會覆蓋cookie,除非設置的cookie的名稱已經存在
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){ // 設置的cookie的名稱已存在,將會覆蓋原有的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
為了繞開瀏覽器的單域名下的cookie數量限制,可以在每個cookie中存放多個更小的字段(子cookie)。子cookie最常見的格式如下:
"name=name1=value1&name2=value2&name3=value3"
子cookie一般也以查詢字符串的格式進行格式化。然后這些值可以使用單個cookie進行存儲和訪問,而非對每個鍵值對使用不同的cookie存儲。最后網站或web應用程序可以無需達到單域名cookie上限也可以存儲更加結構化的數據。為了更好地操作子cookie,必須建立一系列新方法。子cookie的解析和序列化會因子cookie的期望用途而略有不同并更加復雜些。
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關于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的時候需要密切關注cookie的長度,以防超過單個cookie的長度限制
所有的cookie都會由瀏覽器作為請求內容的一部分發送,所以在cookie中存儲大量信息會影響到特定域的請求性能。cookie越大,完成對服務器請求的時間就越長。盡管瀏覽器對cookie進行了大小限制,不過最好還是盡可能在cookie中少存儲信息,以避免影響性能。
cookie的性質和局限性使其并不能作為存儲大量信息的理想手段。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/83556.html
閱讀 3501·2021-11-18 10:07
閱讀 1596·2021-11-04 16:08
閱讀 1525·2021-11-02 14:43
閱讀 1099·2021-10-09 09:59
閱讀 854·2021-09-08 10:43
閱讀 1087·2021-09-07 09:59
閱讀 976·2019-12-27 11:56
閱讀 1033·2019-08-30 15:56