搜尋
首頁web前端js教程JavaScript操作Cookie詳解_基礎知識

什麼是 Cookie

“cookie 是儲存於訪客的電腦中的變數。每當同一台電腦透過瀏覽器請求某個頁面時,就會傳送這個cookie。你可以使用JavaScript 來建立和取回cookie 的值。” - w3school

cookie 是造訪過的網站所建立的文件,用於儲存瀏覽信息,例如個人資料資訊。

從JavaScript的角度來看,cookie 就是一些字串資訊。這些資訊存放在客戶端的電腦中,用於客戶端電腦與伺服器之間傳遞訊息。

在JavaScript中可以透過 document.cookie 來讀取或設定這些資訊。由於 cookie 多用在客戶端和服務端之間進行通信,除了JavaScript以外,服務端的語言(如PHP)也可以存取 cookie。

Cookie 基礎知識

cookie 是有大小限制的,每個 cookie 所存放的資料不能超過4kb,如果 cookie 字串的長度超過4kb,則該屬性將傳回空字串。

由於 cookie 最終都是以文件形式存放在客戶端電腦中,所以查看和修改 cookie 都是很方便的,這就是為什麼常說 cookie 不能存放重要資訊的原因。

每個 cookie 的格式都是這樣的:=;名稱和值都必須是合法的標示符。

cookie 是存在 有效期限的。在預設情況下,一個 cookie 的生命週期就是在瀏覽器關閉的時候結束。如果想要 cookie 能在瀏覽器關掉之後還可以使用,就必須為該 cookie 設定有效期,也就是 cookie 的失效日期。

alert(typeof document.cookie)  結果是 string,曾經我以為是array,還鬧過笑話…囧

cookie 有域和路徑這個概念。域就是domain的概念,因為瀏覽器是個注意安全的環境,所以不同的域 之間是不能互相訪問 cookie 的(當然可以透過特殊設定的達到 cookie 跨域訪問)。路徑就是routing的概念,一個網頁所創建的cookie 只能被與這個網頁在同一目錄或子目錄下得所有網頁訪問,而不能被其他目錄下得網頁訪問(這句話有點繞,一會兒看個例子就好理解了)。

其實建立cookie的方式和定義變數的方式有些相似,都需要使用 cookie 名稱和 cookie 值。同個網站可以建立多個 cookie ,而多個 cookie 可以存放在同一個cookie 檔案中。

Cookie常見問題

cookie 存在兩種:

你瀏覽的目前網站本身所設定的 cookie

來自在網頁上嵌入廣告或圖片等其他網域來源的 第三方 cookie (網站可透過使用這些 cookie 追蹤你的使用資訊)

剛剛基礎知識裡面有說到 cookie 生命週期的問題,其實 cookie 大致可分為兩種狀態:

臨時性質的cookie。目前使用的過程中網站會儲存一些你的個人信息,當瀏覽器關閉後這些信息也會從計算機中刪除

設定失效時間的cookie。就算瀏覽器關閉了,這些資訊產業依然會在電腦中。如 登入名稱和密碼,這樣無須在每次到特定網站時都會登入。這種cookie 可在電腦中保留幾天、幾個月甚至幾年

cookie 有兩種清除方式:

透過瀏覽器工具清除 cookie (有第三方的工具,瀏覽器本身也有這種功能)

透過設定 cookie 的有效期限來清除 cookie

註:刪除 cookie 有時可能會導致某些網頁無法正常運作

瀏覽器可以透過設定來接受和拒絕存取 cookie。

出於功能和效能的原因考慮,建議盡量降低 cookie 的使用數量,並且要盡量使用小 cookie。

關於cookie編碼的細節問題將會在cookie高級篇中單獨介紹。

假如是本機磁碟中的頁面,chrome的控制台是無法用JavaScript讀取寫入操作 cookie 的,解決方案…換一個瀏覽器^_^。

Cookie基礎用法

一.簡單的存取操作

使用JavaScript存取 cookie 時,必須使用Document物件的 cookie 屬性;一行程式碼介紹如何建立和修改一個 cookie :

複製程式碼 程式碼如下:

document.cookie  = 'username=Darren';

以上程式碼中'username'表示 cookie 名稱,'Darren'表示這個名稱對應的值。假設 cookie 名稱並不存在,那麼就是建立一個新的 cookie;如果存在就是修改了這個 cookie 名稱對應的值。如果要多次建立 cookie ,請重複使用這個方法即可。

二.cookie的讀取操作

要精確的對 cookie 進行讀取其實很簡單,就是對字串進行操作。從w3school上copy這段程式碼來做分析:

複製程式碼 程式碼如下:

function getCookie(c_name){
    if (document.cookie.length>0){  //先查詢cookie是否為空,為空就return ""
      c_start=document.cookie.indexOf(c_name "=")  //透過String物件的indexOf()來檢查這個cookie是否存在,不存在就為 -1  
      if (c_start!=-1){
        c_start=c_start c_name.length 1  //最後這個 1其實就是表示"="號啦,這樣就獲取到了cookie值的開始位置
c_end=document.cookie.indexOf(";",c_start)  //其實我剛剛看見indexOf()第二個參數的時候猛然有點暈,後來想起來表示指定的開始索引的位置...這句話是為了得到值的結束位置。因為需要考慮是否是最後一項,所以透過";"號是否存在來判斷
        if (c_end==-1) c_end=document.cookie.length  
        return unescape(document.cookie.substring(c_start,c_end))  //透過substring()得到了值。想了解unescape()得先知道escape()是做什麼的,都是很重要的基礎,想了解的可以搜尋下,在文章結尾處也會進行講解cookie編碼細節
      }
    }
    return ""
  }  
 

當然想實作讀取cookie的方法還有不少,像是數組,正規等,這裡就不往細說了。

三.設定cookie的有效期限

文章中常出現的 cookie 的生命週期也就是有效期限和失效期,即 cookie 的存在時間。在預設的情況下,cookie 會在瀏覽器關閉的時候自動清除,但是我們可以透過expires來設定 cookie 的有效期限。文法如下:

複製程式碼 程式碼如下:

document.cookie = "name=value;expires=date";

上面程式碼中的date值為GMT(格林威治時間)格式的日期型字串,產生方式如下:
複製程式碼 程式碼如下:

var _date = new Date();
_date.setDate(_date.getDate() 30);
_date.toGMTString();

上面三行程式碼分解為幾步來看:

透過new產生一個Date的實例,得到目前的時間;

getDate()方法得到目前本地月份中的某一天,接著加上30就是我希望這個cookie能過在本地保存30天;

接著透過setDate()方法來設定時間;

最後 用toGMTString()方法把Date物件轉換為字串,並回傳結果

透過下面這個完整的函數來說明在創建 cookie 的過程中我們需要注意的地方 – 從w3school複製下來的。建立一個在 cookie 中儲存資訊的函數:

複製程式碼 程式碼如下:

function setCookie(c_name, value, expiredays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate() expiredays);
    document.cookie=c_name "=" escape(value) ((expiredays==null) ? "" : ";expires=" exdate.toGMTString());
}
//使用方法:setCookie('username','Darren',30)   

現在我們這個函數是按照天數來設定cookie的有效時間,如果想以其他單位(如:小時)來設置,那麼改變第三行程式碼即可:

複製程式碼 程式碼如下:

exdate.setHours(exdate.getHours() expiredays);

這樣設定以後的cookie有效期限就是依照小時為單位的。

常見問題中有提到清除 cookie 的兩種方法,現在要說的是使 cookie 失效,透過把有效期的時間設定為一個已過期的時間。既然已經有了設定有效期限的方法,那麼設定失效期的方法就請有興趣的朋友自己動手了^_^。下面繼續比較深的cookie話題。

Cookie 高級篇

一.cookie 路徑概念

在基礎知識中有提到 cookie 有域和路徑的概念,現在來介紹路徑在 cookie 中的作用。

cookie 一般都是因為使用者造訪頁面而建立的,可是並不是只有在建立 cookie 的頁面才可以存取這個 cookie。

預設情況下,只有與創建 cookie 的頁面在同一個目錄或子目錄下的網頁才可以訪問,這個是因為安全方面的考慮,造成不是所有頁面都可以隨意訪問其他頁面創建的 cookie。舉例:

在「http://www.jb51.net/Darren_code/」 這個頁面建立一個cookie,那麼在」/Darren_code/」這個路徑下的頁麵如: 「http://www.jb51.net/Darren_code /archive/2011/11/07/Cookie.html」這個頁面預設就能取到cookie資訊。

可在預設情況下, 「http://www.jb51.net」或「http://www.jb51.net/xxxx/」 就不可以存取這個cookie(光看沒用,實踐出真理^_^)。

那麼如何讓這個 cookie 能被其他目錄或父級的目錄存取類,透過設定 cookie 的路徑就可以實現。例如下:

複製程式碼 程式碼如下:

document.cookie = "name=value;path=path"
document.cookie = "name=value;expires=date;path=path"

紅色字體path就是 cookie 的路徑,最常用的例子就是讓 cookie 在跟目錄下,這樣不管是哪個子頁面創建的 cookie,所有的頁面都可以訪問到了:

複製程式碼 程式碼如下:

document.cookie = "name=Darren;path=/";

二.cookie 域概念

路徑能解決在同一個網域下存取 cookie 的問題,咱們接著說 cookie 實作同域之間存取的問題。文法如下:

複製程式碼 程式碼如下:

document.cookie = "name=value;path=path;domain=domain";

紅色的domain就是設定的 cookie 域的值。

例如”www.qq.com” 與“sports.qq.com” 公用一個關聯的域名”qq.com”,我們如果想讓“sports.qq.com” 下的cookie被”www.qq. com” 訪問,我們就需要用到cookie 的domain屬性,並且需要把path屬性設為“/”。例:

複製程式碼 程式碼如下:

document.cookie = "username=Darren;path=/;domain=qq.com";

註:一定的是同域之間的訪問,不能把domain的值設定成非主域的網域。

三.cookie 安全性

通常 cookie 資訊都是使用HTTP連線傳遞數據,這種傳遞方式很容易被查看,所以 cookie 儲存的資訊容易被竊取。假如 cookie 中所傳遞的內容比較重要,那麼就要求使用加密的資料傳輸。

所以 cookie 的這個屬性的名稱是“secure”,預設的值為空。如果一個 cookie 的屬性為secure,那麼它與伺服器之間就透過HTTPS或其它安全協定傳遞資料。文法如下:

複製程式碼 程式碼如下:

document.cookie = "username=Darren;secure"

把cookie設定為secure,只確保 cookie 與伺服器之間的資料傳輸過程加密,而儲存在本地的 cookie檔案並不會加密。如果想讓本地cookie也加密,就得自己加密資料。

註:就算設定了secure 屬性也並不代表他人不能看到你機器本地保存的 cookie 信息,所以說到底,別把重要信息放cookie就對了,囧…

四.cookie 編碼細節

原本想在常見問題那段介紹cookie編碼的知識,因為如果對這個不了解的話編碼問題確實是一個坑,所以還是詳細說說。

在輸入cookie資訊時不能包含空格,分號,逗號等特殊符號,而在一般情況下,cookie 資訊的儲存都是採用未編碼的方式。所以,在設定 cookie 資訊以前要先使用escape()函數將 cookie 值資訊編碼,在取得到 cookie 值得時候再使用unescape()函數把值轉換回來。如設定cookie時:

複製程式碼 程式碼如下:

document.cookie = name "=" escape (value);

再看看基礎用法時提到的getCookie()內的一句:

複製程式碼 程式碼如下:

return unescape(document.cookie.substring(c_start,c_end));

這樣就不用擔心因為在cookie值中出現了特殊符號而導致 cookie 資訊出錯了。

個人代碼

複製程式碼 程式碼如下:

/*設定Cookie*/

function setCookie(c_name, value, expiredays, path, domain, secure) { 
 var exdate = new Date(); //取得目前時間 
 exdate.setDate(exdate.getDate() expiredays);  //過期時間  
 document.cookie = c_name "=" //cookie名稱
 escape(value) //將cookie值進行編碼
 ((expiredays == null) ? "" : ";expires=" exdate.toGMTString()) //設定過期時間
 ((path == null) ? '/' : ';path=' path) //設定存取路徑
 ((domain == null) ? '' : ';domain=' domain) //設定存取域
 ((secure == null) ? '' : ';secure=' secure);  //設定是否加密
};
setCookie('test', 'name=sheng;sex=men;lancer=dullbear', 30);
setCookie('bb', 'name=sheng;sex=men', 30);

/*取得Cookie*/

function getCookie(c_name, index) {
 var cookies = document.cookie; //取得cookie值
 var cookieLen = cookies.length; //取得cookie長度
 if (cookieLen > 0) { //cookie不為空白時

  var c_start = cookies.indexOf(c_name '='); //找出需要cookie值在cookie中序號
  if (c_start > -1) { //cookie值存在時
   c_start = c_name.length 1; //取得cookie值開始序號

   var c_end = cookies.indexOf(';', c_start); //取得cookie值結束序號
   if (c_end == -1) { //當cookie是最後一個時
    c_end = cookieLen; //設定cookie值結束序號為cookie長度
   };

   var cookieStr = unescape(cookies.substring(c_start, c_end)); //取得解碼cookie值

   var cookieObj = cookieStr.split(';'); //分割cookie值

   index = ((index == null) ? 0 : index); //判斷index是否傳值

   var goalObj = cookieObj[index]; //索引陣列
   var goalStr = goalObj.split('=');
   var getcook = goalStr[1]; //取得所需取的cookie值
   return getcook;
  };
 } else {
  console.log('頁面沒有cookie');
 }
};

alert(getCookie('test', 0)); //印出查詢cookie值

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C/C在JavaScript口譯員和編譯器中的作用C/C在JavaScript口譯員和編譯器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中