帶你全面了解cookie

如何使用cookie

cookie是保存在客戶端系統(tǒng)中的一個(gè)文本文件,都與指定的Web服務(wù)器的域中的固定目錄相關(guān)聯(lián)。
當(dāng)瀏覽器向服務(wù)器請求該目錄下的頁面時(shí),關(guān)聯(lián)的cookie信息就會隨著HTTP請求以頭部信息的方式發(fā)送給服務(wù)器。
在客戶端,用戶可以使用JavaScript讀寫cookie信息,服務(wù)器端腳本也能夠編輯這些cookie信息。


cookie的優(yōu)點(diǎn)主要表現(xiàn)

  • 簡單易用

  • 瀏覽器負(fù)責(zé)發(fā)送數(shù)據(jù)

  • 瀏覽器自動管理不同站點(diǎn)的cookie
    經(jīng)過長期使用,cookie也越來越暴露出先天的不足,具體說明如下

  • 使用簡單的文本文件儲存數(shù)據(jù),安全性很差,很容易被黑客竊取

  • cookie 中存儲的數(shù)據(jù)容量有限,其上限為4KB

  • 存儲cookie的數(shù)量有限,多數(shù)瀏覽器上限為30或50個(gè),如IE6只支持每個(gè)域名20個(gè)cookie,也有部分瀏覽器存儲cookie的數(shù)量高達(dá)300個(gè)

  • 如果瀏覽器的安全配置為最高級別,則cookie會失效

  • cookie不適合大數(shù)據(jù)的儲存,因?yàn)閏ookie會由每個(gè)服務(wù)器的請求來傳遞,從而造成cookie速度緩慢、效率低下

寫入cookie信息

  • 使用 document.cookie 可以讀寫cookie字符串信息
  • cookie字符串是一組明值對,名稱和值之間以等號相連,名值對之間使用分號進(jìn)行分隔。值中不能包含分號、逗號和空白符。如果包含特殊字符,必須使用 escape()函數(shù)對其進(jìn)行編碼,在讀取cookie時(shí)也必須使用unescape()函數(shù)進(jìn)行解碼。
如何使用cookie存儲cookie信息

var d = new Date();
d = d.toString();
d = "date=" + escape(d);  // 設(shè)置 cookie字符串
document.cookie = d;   //  寫入cookie

在默認(rèn)狀態(tài)下,cookie信息只能在當(dāng)前會話期(當(dāng)前瀏覽器窗口)中有效并存在,一旦結(jié)束會話(關(guān)閉瀏覽器窗口),這些cookie信息就會被自動刪除。
如果長久保存cookie信息,可以設(shè)置expires屬性,把字符串"expires=date" 附加到cookie字符串后面,用法如下

name = value; expires = date
date為格林威治日期時(shí)間(GTM)格式:Sun,30 Apr 2017 00:00:00 UTC
使用 Date.toGMTString()方法可以快速把時(shí)間對象轉(zhuǎn)換為GTM格式。

創(chuàng)建一個(gè)有效期為一個(gè)月的cookie

var d = new Date();     // 實(shí)例化當(dāng)前日期對象
d.setMonth(d.getMonth() + 1);  // 提取月份值并加1,然后重新設(shè)置當(dāng)前日期對象
d = "date=" + escape(d) + ";expires=" +d.toGMTString();  // 在cookie字符串的尾部添加expires 名值對

document.cookie = d;  // 寫入cookie

cookie 信息是有域和路徑限制的。在默認(rèn)情況下,僅在當(dāng)前頁面路徑內(nèi)有效。其它域或本域其它目錄中的文件是無權(quán)訪問的。
用戶可以使用cookie 的 path和domain屬性重設(shè)可見路徑和作用域。

name = value; expires=date; domain=domain; path=path;

如果設(shè)置 path=/, 可以設(shè)置cookie信息與服務(wù)器根目錄與其子目錄相關(guān)聯(lián),從而實(shí)現(xiàn)在整個(gè)網(wǎng)站中共享cookie信息;如果只想讓bbs目錄下的頁面訪問,可以設(shè)置path=/bbs即可。

很多網(wǎng)站包含多個(gè)域名 ,在默認(rèn)情況下,cookie信息只能在本域中訪問,通過設(shè)置cookie的domain屬性可修改域的范圍。domain = baidu.com即可。這樣所有baidu.com 的所有子域下的所有頁面相關(guān)聯(lián),包括www、news、tieba等。

cookie使用secure屬性定義cookie信息的安全性。secure屬性取值包括secure或者空字符串。在默認(rèn)情況下,secure屬性值為空,也就是說cookie信息使用不安全的HTTP鏈接傳遞數(shù)據(jù)。如果一個(gè)cookie設(shè)置了secure,那么cookie信息在客戶端與Web服務(wù)器之間傳遞時(shí),就通過HTTPS或者其他安全協(xié)議傳遞數(shù)據(jù)

綜上所述,比較完善的cookie信息字符串應(yīng)該包括下面幾個(gè)部分

  • cookie信息字符串,包含一個(gè)名/值對,默認(rèn)為空
  • cookie有效期,包含一個(gè)GTM格式的字符串,默認(rèn)為當(dāng)前會話期(即如果沒有設(shè)置,則當(dāng)關(guān)閉瀏覽器時(shí),cookie信息就因過期而被清除)
  • cookie有效路徑,默認(rèn)為cookie所在頁面目錄及其子目錄
  • cookie有效域,默認(rèn)為設(shè)置cookie的頁面所在的域
  • cookie安全性,默認(rèn)為不采用安全加密措施進(jìn)行傳遞

下面把寫入cookie信息的實(shí)現(xiàn)代碼進(jìn)行封裝

//  寫入cookie
//  參數(shù) name表示cookie名稱,value表示cookie值,expirs表示有效天數(shù),path表示有效路徑,domain表示域,secure表示安全性設(shè)置。其中name、value、path、和domain參數(shù)為字符串類型,傳遞時(shí)需要加上引號,而參數(shù)expirs為數(shù)值,secure表示布爾值,表示是否加密傳輸cookie信息
//  返回值:無

function setCookie( name,value,expires,path,domain,secure){
     var today = new Date();
     today.setTime( today.getTime());
     if(expires){
        expires = expires * 1000 * 60 * 60 * 24;
     }
     
     var expires_date = new Date( tody.getTime() + (expires) );
     document.cookie = name + "=" + escape(value) +
       ( (expires) ? ";expires=" + expires_date.toGTMString()  : "" )  +
       ( (path) ? ";path=" + path : ""  ) +
       ( (domain) ? ";domain="  +domain : "") +
       ( (secure) ? ";secure="  : "" );

}

讀取cookie信息

訪問 document.cookie可以讀取cookie信息,cookie屬性值是一個(gè)由零個(gè)或多個(gè)名值對的字符串組成的字符串列表,每個(gè)名值對之間通過分號進(jìn)行分隔。

把cookie字符串轉(zhuǎn)換成對象類型

//  把cookie字符串轉(zhuǎn)換為對象類型
//  參數(shù):無
//  返回值:對象,儲存cookie信息,其中名稱作為對象的屬性而存在,而值作為屬性值而存在

function getCookie(){       
   var  a  =  document.cookie.split(";");   //  把cookie字符串分為數(shù)組
   var  o  = { };                        //  臨時(shí)對象直接量
   for(var i = 0;i<a.length; i++){    //  遍歷數(shù)組
        var  v = a[i].split("=");       //  劈開每個(gè)數(shù)組元素
        o[v[0]] = v[1];      //  把元素的名和值轉(zhuǎn)換為對象的屬性和屬性值
   
   }
    return o;     //  返回對象
}

如果寫入cookie進(jìn)行了編碼,讀取時(shí)要記得解碼

===================

// 在實(shí)際開發(fā)中,更多的操作是直接讀取某個(gè)cookie值,而不是讀取所有cookie信息。

// 讀取指定cookie信息
// 參數(shù):cookie名稱
// 返回值:cookie值

function getCookie(name){
       var start = document.cookie.indexOf(name + " = "); // 提取cookie中與名稱相同的字符串索引
       var len = start + name.length + 1;  // 計(jì)算值的索引位置
       if((!start)&&(name!=document.cookie.subString(0,name.length))){
       // 不存在則返回null    此處的判斷就是需要注意0是false
       return  null;
       }
       if(start == -1) return null;  //  如果沒有找到,則返回null
       var end = document.cookie.indexOf(";",len);//  獲取值后面“;”的索引位置
       if(end == -1) end = documen.cookie.length; // 如果索引值為-1,設(shè)置為cookie字符串的長度
       return unescape(documen.cookie.substring(len,end));//  獲取名稱對應(yīng)的截取值,并解碼返回
}

修改和刪除cookie信息

如果要改變指定cookie的值,只需要使用相同名稱和新值重新設(shè)置該cookie即可。如果要?jiǎng)h除某個(gè)cookie信息,只需要為該cookie設(shè)置一個(gè)已過期的expires屬性值

//  封裝一個(gè)刪除指定cookie信息的方法,這個(gè)方法需要調(diào)用getCookie()函數(shù)

// 刪除指定cookie 信息
// 參數(shù):name表示cookie名稱,path表示所在路徑,domain表示所在域
// 返回值

function deleteCookie(name,path,domain){
    if(getCookie(name)) document.cookie = name + " = "+  //  如果名稱存在,則清空
     ((path)?";path=" + path : "")+   // 如果存在路徑,則加上
     ((domain)? ";domain=" +domain : "")+  // 如果存在域,則加上
     "expires=Thu,01-Jun-1970 00:00:01 GTM";
     // 設(shè)置有效期為過去時(shí),即表示該cookie無效,將會被瀏覽器清除
}


附加cookie信息

切記請勿濫用cookie瀏覽器對cookie都有個(gè)數(shù)限制,為了避免超出這個(gè)限制,可以把多條信息都保存在一個(gè)cookie中,而不是為每條信息都新建一個(gè)cookie。由于cookie可存儲的字符串最大長度為4kb(即4096個(gè)字符)

//  在cookie中存儲更多的信息。

//  定義有效期
var d = new Date();
d.setMonth(d.getMonth() + 1);
d = d.toGMTString();
// 定義cookie字符串
var a = " name:a,age:20,addr:beijin"  //子名/值串
var c = "user=" + escape(a)    // 組合cookie字符串
c += ";" + "expires=" +d;   // 設(shè)置有效期為1個(gè)月
document.cookie = c;   //  寫入cookie信息




?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景在HTTP協(xié)議的定義中,采用了一種機(jī)制來記錄客戶端和服務(wù)器端交互的信息,這種機(jī)制被稱為cookie,cooki...
    時(shí)芥藍(lán)閱讀 2,472評論 1 17
  • 原文鏈接:https://segmentfault.com/a/1190000004556040[https://...
    R_X閱讀 483評論 0 1
  • HTTP cookies,通常稱之為“cookie”,已經(jīng)存在很長時(shí)間了,但是仍然沒有被充分理解。首要問題是存在許...
    NoFacePeace閱讀 510評論 0 1
  • 細(xì)說Cookie 閱讀目錄 開始 Cookie 概述 Cookie的寫、讀過程 使用Cookie保存復(fù)雜對象 Js...
    拉肚閱讀 1,210評論 0 4
  • 一、簡介 提起Java不得不說的一個(gè)開發(fā)場景就是Web開發(fā),也是Java最熱門的開發(fā)場景之一,說到Web開發(fā)繞不開...
    __元昊__閱讀 3,657評論 1 9

友情鏈接更多精彩內(nèi)容