1. 程式人生 > >JS操作Cookie詳解(轉)

JS操作Cookie詳解(轉)

1. 什麼是 Cookies?

2. Cookie 的構成

3. 操縱 Cookies

4. Cookie 怪獸

什麼是Cookies?

你會問,什麼是cookies呢? cookie 是瀏覽器儲存在使用者計算機上的少量資料。它與特定的WEB頁或WEB站點關聯起來,自動地在WEB瀏覽器和WEB伺服器之間傳遞。

比如,如果你執行的是Windows作業系統,使用Internet Explorer上網,那麼你會發現在你的“Windows”目錄下面有一個子目錄,叫做“Temporary Internet Files”。如果你有空看看這個目錄,就會發現裡面有一些檔案,檔名稱看起來就象電子郵件地址。比如在我機器上的這個目錄裡,就有

[email protected]osoft.com ”這樣的檔案。這是一個cookie 檔案,這個檔案從哪來呢?猜一猜,它來自微軟的支援站點。順便說一句,這不是我的電子郵件地址,特此澄清。

對於管理細小的、不重要的、不想儲存在中央資料庫裡的細節資訊,Cookies 是個很不錯的方案。(這不是說大家的名字不重要。)比如,目前網站上不斷增長的自定義服務,可以為每個使用者定製他們要看的內容。如果你設計的就是這樣一個 站點,那麼你怎麼來管理這樣的資訊:一個使用者喜歡綠色的選單條,而另一個喜歡紅色的。確實是個累人的問題。不過,這樣的資訊,可以很安全地記錄到 cookie,並儲存在使用者的計算機上,而你自己的資料庫空間可以留給更長久更有意義的資料。

FYI: Cookies 對於安全用途,通常很有用。我不想在此就這一問題過於深入,只是提供一個示例,可以看到如何使用在一段時間之後過期的cookies來保證站點安全:

1. 使用使用者名稱和口令,通過 SSL 登入。

2. 在伺服器的資料庫裡檢查使用者名稱和口令。如果登入成功,建立一個當前時間標籤的訊息摘要 (比如 MD5) ,並把它儲存在cookie和伺服器資料庫裡。把使用者的登入時間儲存在伺服器資料庫裡面的使用者記錄裡。

3. 在進行每個安全事務時(使用者處於登入狀態的任何事務),把cookie的訊息摘要和儲存在伺服器資料庫裡的摘要進行比較,如果比較失敗,就把使用者引導到登入介面。

4. 如果第3步檢查通過,那麼檢查當前時間和登入時間之音經過的時間是否超過允許的時間長度。如果使用者已經超時,那麼就把使用者引到登入介面。

5. 如果第3步和第4步都通過了,那麼把登入時間重新設定成當前時間,允許事務發生。那些需要你登入的安全站點,可能多數使用的都是和這裡介紹的類似的方法。

Cookie的構成

Cookies最初設計時,是為了CGI程式設計。但是,我們也可以使用Javascript腳 本來操縱cookies。在本文裡,我們將演示如何使用 Javascript指令碼來操縱cookies。(如果有需求,我可能會在以後的文章裡介紹如何使用Perl進行cookie管理。但是如果實在等不得, 那麼我現在就教你一手:仔細看看CGI.pm。在這個CGI包裡有一個cookie()函式,可以用它建立cookie。但是,還是讓我們先來介紹 cookies的本質。

在Javascript腳本里,一個cookie 實際就是一個字串屬性。當你讀取cookie的值時,就得到一個字串,裡面當前WEB頁使用的所有cookies的名稱和值。每個cookie除了 name名稱和value值這兩個屬性以外,還有四個屬性。這些屬性是: expires過期時間、 path路徑、 domain域、以及 secure安全。

Expires – 過期時間。指定cookie的生命期。具體是值是過期日期。如果想讓cookie的存在期限超過當前瀏覽器會話時間,就必須使用這個屬性。當過了到期日期時,瀏覽器就可以刪除cookie檔案,沒有任何影響。

Domain – 域。指定關聯的WEB伺服器或域。值是域名,比如jzxue.com。這是對path路徑屬性的一個延伸。如果我們想讓 catalog.mycompany.com 能夠訪問shoppingcart.mycompany.com設定的cookies,該怎麼辦? 我們可以把domain屬性設定成“mycompany.com”,並把path屬性設定成“/”。FYI:不能把cookies域屬性設定成與設定它的 伺服器的所在域不同的值。

Secure – 安全。指定cookie的值通過網路如何在使用者和WEB伺服器之間傳遞。這個屬性的值或者是“secure”,或者為空。預設情況下,該屬性為空,也就是 使用不安全的HTTP連線傳遞資料。如果一個 cookie 標記為secure,那麼,它與WEB伺服器之間就通過HTTPS或者其它安全協議傳遞資料。不過,設定了secure屬性不代表其他人不能看到你機器本 地儲存的cookie。換句話說,把cookie設定為secure,只保證cookie與WEB伺服器之間的資料傳輸過程加密,而儲存在本地的 cookie檔案並不加密。如果想讓本地cookie也加密,得自己加密資料。

操縱Cookies

請記住,cookie就是文件的一個字串屬性。要儲存cookie,只要建立一個字串, 格式是name=<value>(名稱=值),然後把文件的 document.cookie 設定成與它相等即可。比如,假設想儲存表單接收到的使用者名稱,那麼程式碼看起來就象這樣:

document.cookie = "username" + escape(form.username.value);

在這裡,使用 escape() 函式非常重要,因為cookie值裡可能包含分號、逗號或者空格。這就是說,在讀取cookie值時,必須使用對應的unescape()函式給值解碼。

我們當然還得介紹cookie的四個屬性。這些屬性用下面的格式加到字串值後面:

name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]

名稱=<值>[; expires=<日期>][; domain=<域>][; path=<路徑>][; 安全]

<value>, <date>, <domain> 和 <path> 應當用對應的值替換。<date> 應當使用GMT格式,可以使用Javascript指令碼語言的日期類Date的.toGMTString() 方法得到這一GMT格式的日期值。方括號代表這項是可選的。比如在 [; secure]兩邊的方括號代表要想把cookie設定成安全的,就需要把"; secure" 加到cookie字串值的後面。如果"; secure" 沒有加到cookie字串後面,那麼這個cookie就是不安全的。不要把尖括號<> 和方括號[] 加到cookie裡(除非它們是某些值的內容)。設定屬性時,不限屬性,可以用任何順序設定。

下面是一個例子,在這個例子裡,cookie "username" 被設定成在15分鐘之後過期,可以被伺服器上的所有目錄訪問,可以被"mydomain.com"域裡的所有伺服器訪問,安全狀態為安全。

// Date() 的構造器設定以毫秒為單位

// .getTime() 方法返回時間,單位為毫秒

// 所以要設定15分鐘到期,要用60000毫秒乘15分鐘

var expiration = new Date((new Date()).getTime() + 15 * 60000);

document.cookie = "username=" + escape(form.username.value)+ "; expires ="

+ expiration.toGMTString() + "; path=" + "/" + "; _

domain=" + "mydomain.com" + "; secure";

讀取cookies值有點象個小把戲,因為你一次就得到了屬於當前文件的所有cookies。

// 下面這個語句讀取了屬於當前文件的所有cookies

var allcookies = document.cookie;

現在,我們得解析allcookies變數裡的不同cookies,找到感興趣的指定cookie。這個工作很簡單,因為我們可以利用Javascript語言提供的擴充套件字串支援。

如果我們對前面分配的cookie "username" 感興趣,可以用下面的指令碼來讀取它的值。

// 我們定義一個函式,用來讀取特定的cookie值。


function getCookie(cookie_name)

{

var allcookies = document.cookie;

var cookie_pos = allcookies.indexOf(cookie_name);

// 如果找到了索引,就代表cookie存在,

// 反之,就說明不存在。

if (cookie_pos != -1)

{

// 把cookie_pos放在值的開始,只要給值加1即可。

cookie_pos += cookie_name.length + 1;

var cookie_end = allcookies.indexOf(";", cookie_pos);

if (cookie_end == -1)

{

cookie_end = allcookies.length;

}

var value = unescape(allcookies.substring(cookie_pos, cookie_end));

}

return value;

}
 

// 呼叫函式

var cookie_val = getCookie("username");

上面例程裡的 cookie_val 變數可以用來生成動態內容,或者傳送給伺服器端CGI指令碼進行處理。現在你知道了使用Javascript指令碼操縱cookies的基本方法。但是,如果 你跟我一樣,那麼我們要做的第一件事,就是建立一些介面函式,把cookies處理上的麻煩隱藏起來。不過,在你開始程式設計之前,稍候片刻。這些工作,早就 有人替你做好了。你要做的,只是到哪去找這些介面函式而已。

比如,在David Flangan的Javascript: The Definitive Guide 3rd Ed.這本書裡,可以找到很好的cookie應用類。你也可以在Oreilly的WEB站點上找到這本書裡的例子。本文最後的連結列表裡,有一些訪問這些 cookie示例的直接連結。

Cookies 怪獸

因為某些原因Cookies 的名聲很不好。許多人利用cookies做一些卑鄙的事情,比如流量分析、點選跟蹤。Cookies 也不是非常安全,特別是沒有secure屬性的cookies。不過,即使你用了安全的cookies,如果你和別人共用計算機,比如在網咖,那麼別人就 可以窺探計算機硬碟上未加密儲存的cookie檔案,也就有可能竊取你的敏感資訊。所以,如果你是一個WEB開發人員,那麼你要認真考慮這些問題。不要濫 用cookies。不要把使用者可能認為是敏感的資料儲存在cookies裡。如果把使用者的社會保險號、信用卡號等儲存在cookie裡,等於把這些敏感信 息放在窗戶紙下,無異於把使用者投到極大危險之中。一個好的原則是,如果你不想陌生人瞭解你的這些資訊,那就不要把它們儲存在cookies裡。

另外,cookies還有一些實際的限制。Cookies保留在計算機上,不跟著使用者走。如 果使用者想換計算機,那麼新計算機無法得到原來的 cookie。甚至使用者在同一臺計算機上使用不同瀏覽器,也得不到原來的cookie:Netscape 不能讀取Internet Explorer 的cookies。

還有,使用者也不願意接受cookies。所以不要以為所有的瀏覽器都能接受你發出的cookies。如果瀏覽器不接受cookies,你要保證自己的WEB站點不致因此而崩潰或中斷。

另外WEB 瀏覽器能保留的cookies不一定能超過300個。也沒有標準規定瀏覽器什麼時候、怎麼樣作廢cookies。所以達到限制時,瀏覽器能夠有效地隨機刪 除cookies。瀏覽器保留的來自一個WEB伺服器上的cookies,不超過20個,每個cookie的資料(包括名稱和值),不超過4K位元組。(不 過,本文裡的cookie尺寸沒問題,它只佔了12 K位元組,儲存在3個3 cookies裡。)

簡而言之,注意保持cookie簡單。不要依賴cookies的存在,不要在每個cookie裡儲存太多資訊。不要儲存太多的cookes。但是,拋除這些限制,在技巧高超的WEB管理員手裡,cookie的概念是一個有用的工具。

外部連結

每個 Javascript 程式設計師都應當有一份Javascript: David Flanagan 的The Definitive Guide。 這本書裡找到cookie 類例程可以幫助你把不止一個變數編碼到單一的cookie,克服掉“每個WEB伺服器20 個cookies的限制”。

下面是我測試時的程式碼:


<html

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>Cookie的使用方法</title>

<script language="javascript" type="text/javascript">

<!--

//檢查Cookie是否有效

function setCookie(){

 if(!navigator.cookieEnabled){

  alert('不Cookie項!');

 }else{

  var date=new Date();

  date.setTime(date.getTime()+60000*10);

  document.cookie='userName='+escape(document.form1.userName.value)+';expires='+date.toGMTString()+';path=/'+';domaim=zgdsc.cn'+':secure';

 } 

}

function showValue(){

 alert(unescape(document.cookie));

}

function clearValue(){

 var date=new Date();

 date.setTime(date.getTime()-1);

 document.cookie='userName='+escape(document.form1.userName.value)+';expires='+date.toGMTString()+';path=/'+';domain=zgdsc.cn'+';secure';

}

-->

</script>

</head>

<body>

<form id="form1" name="form1" method="post" action="#">

輸入使用者名稱:

<input type="text" name="userName"  />

  <input type="radio" name="cookieEnabled" value="radiobutton" onclick="setCookie()" />

  儲存Cookie

  <label>

  <input type="button" name="Submit" value="顯示" onclick="showValue()" />

  </label>

  <label>

  <input type="button" name="Submit2" value="清除" onclick="clearValue()"/>

  </label>

</form>

</body>

</html>
 

相關推薦

JS操作Cookie()

1. 什麼是 Cookies? 2. Cookie 的構成 3. 操縱 Cookies 4. Cookie 怪獸 什麼是Cookies? 你會問,什麼是cookies呢? cookie 是瀏覽器儲存在使用者計算機上的少量資料。它與特定的WEB頁或WEB站點關聯起來,自動地在WEB瀏覽器和WEB伺服器之間傳遞

JSCookie及示例展示

Cookie的作用 cookie機制將資訊儲存於使用者硬碟,因此可以作為全域性變數,這是它最大的一個優點。它可以用於以下幾種場合。 (1)儲存使用者登入狀態。例如將使用者id儲存於一個cookie內,這樣當用戶下次訪問該頁面時就不需要重新登入了,現在很多

js操作cookie 使用

cookie概述 在上一節,曾經利用一個不變的框架來儲存購物欄資料,而商品顯示頁面是不斷變化的,儘管這樣能達到一個模擬 全域性變數的功能,但並不嚴謹。例如在導航框架頁面內右擊,單擊快捷選單中的【重新整理】命令,則所有的JavaScript變數都會丟失。因此,要實現嚴格的 跨頁面全域性變數,這種方式是不行的,

JS中document.cookie

一個 參數 position 函數實現 some document urn 重新 地址 什麽是cookie? cookie 是存儲於訪問者的計算機中的變量。每當同一臺計算機通過瀏覽器請求某個頁面時,就會發送這個 cookie。你可以使用 JavaScript 來創建和取回

Cookie 以及實現一個 cookie 操作

Cookie 詳解以及實現一個 cookie 操作庫 cookie 在前端有著大量的應用,但有時我們對它還是一知半解。下面來看看它的一些具體的用法 Set-Cookie 伺服器通過設定響應頭來設定客戶端的 cookie,形如: Set-Cookie: &lt;cookie名&gt;=&

POI操作Excel,讀取xls和xlsx格式的文件

shee xss split 類型 後綴 .sh lan xls lin package org.ian.webutil; import java.io.File; import java.io.FileInputStream; import java.io.FileN

Rsyslog配置文件()

安裝 權限 lines true time cor optional tex 以及 最近在搭建日誌審計服務器,使用了rsyslog,發現這篇文章很有用,收藏一下。 原文鏈接:http://my.oschina.net/0757/blog/198329 具體內容: 非常詳

Buffer類的()

iteye 原始數據類型 pub bst exception 如何 數字 硬件 final Buffer 類是 java.nio 的構造基礎。一個 Buffer 對象是固定數量的數據的容器,其作用是一個存儲器,或者分段運輸區,在這裏,數據可被存儲並在之後用於檢索。緩沖區可以

JS中JSON

名稱 完全 rip json詳解 core 兼容 json字符串 之間 org JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,采用完全獨立於語言的文本格式,是理想的數據交換格式。同時,JSON是 JavaScript 原生格式

UML類圖與類的關系--

position 好的 -a erp 生命 靜態 pan 雙向 單選 http://www.uml.org.cn/oobject/201104212.asp 原文地址 UML類圖與類的關系詳解 2011-04-21 來源:網絡

CentOS 7.1下SSH遠程登錄服務器-

info which 開啟 如何 pty wan public keygen ger 轉自:http://www.linuxidc.com/Linux/2016-03/129204.htm 一、明文傳輸與加密傳輸 明文傳輸:當我們的數據包在網絡上傳輸的時候,以數據包的原

lucene、lucene.NET詳細使用與優化[]

構造 bitset 更多 隱患 .net wrapper 屬性設置 似的 擔心 1 lucene簡介1.1 什麽是luceneLucene是一個全文搜索框架,而不是應用產品。因此它並不像www.baidu.com 或者google Desktop那麽拿來就能用,它只是提供了

c++拷貝函數()

light clu 默認 fun 編譯 存在 自動生成 pri 指針成員 一. 什麽是拷貝構造函數 首先對於普通類型的對象來說,它們之間的復制是很簡單的,例如 int a = 100; int b = a; 而類對象與普通對象不同,類對象內部結構一般

js操作cookie的一些註意項

時也 初創 string 過期 move exp 安全 完整 file  這兩天做購物車邏輯。依照通常的做法,把預購信息存放在cookie裏,結果發生了非常多不可理喻的事情,完整的證明了我對cookie的無知。。。

KM算法[]

分割 貪心 方便 itl 兩個 最大權值匹配 之間 保留 top KM算法詳解 原帖鏈接:http://www.cnblogs.com/zpfbuaa/p/7218607.html#_label0 閱讀目錄 二分圖博客推薦 匈牙利算法步驟 匈牙利算

js 操作cookie,getCookie,setCookie ,removeCookie

span repl console etc 空格 alert true nbsp name document.cookie = ‘name=‘+‘username‘; document.cookie = ‘value=‘+‘value1‘; var c

安裝MACOS操作步驟

中文 相同 sudo 否則 一次 install -1 感謝 重啟                           安裝MACOS操作步驟詳解                                               作者:尹正傑 版權聲明:原創作品,

緩沖加載圖片的 jQuery 插件 lazyload.js 使用方法

java ajax jpg ide javascrip ava ade src doc 在寫代碼的時候,經常會用到懶加載的模式,以前是通過window.onload的模式去加載,但是圖片很多或者用ajax請求的時候,就會很麻煩,現在用lazyload的模式加載方便很多

MANIFEST.MF 文件內容完全()

做的 software 多功能 keys 要求 ext pmd 獲取 可執行 打開Java的JAR文件我們經常可以看到文件中包含著一個META-INF目錄, 這個目錄下會有一些文件,其中必有一個MANIFEST.MF,這個文件描述了該Jar文件的很多信息,下面將詳細介紹MA

Flume日誌收集系統架構--

with 指定 mwl 裏程碑 工程 生命 數據接收 dba -i 2017-09-06 朱潔 大數據和雲計算技術 任何一個生產系統在運行過程中都會產生大量的日誌,日誌往往隱藏了很多有價值的信息。在沒有分析方法之前,這些日誌存儲一段時間後就會被清理。隨著技術的發展和