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

JavaScript操作Cookie詳解_基礎知識

May 16, 2016 pm 04:12 PM
javascript

什麼是 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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles