Cookie 基礎(chǔ)知識我們已經(jīng)知道,在 document 對象中有一個(gè) cookie 屬性。但是 Cookie 又是什么?“某些 Web 站點(diǎn)在您的硬盤上用很小的文本文件存儲了一些信息,這些文件就稱為 Cookie。”—— MSIE 幫助。一般來說,Cookies 是 CGI 或類似,比 HTML 高級的文件、程序等創(chuàng)建的,但是 JavaScript 也提供了對 Cookies 的很全面的訪問權(quán)利。 在繼續(xù)之前,我們先要學(xué)一學(xué) Cookie 的基本知識。 每個(gè) Cookie 都是這樣的:cookie名=cookie值;cookie本身僅僅是一個(gè)字符串,是一組名值對;多組名值對用分號加空格分隔! "cookie名"的限制與 JavaScript 的命名限制大同小異,少了“不能用 JavaScript 關(guān)鍵字”,多了“只能用可以用在 URL 編碼中的字符”。后者比較難懂,但是只要你只用字母和數(shù)字命名,就完全沒有問題了?!爸怠钡囊笠彩恰爸荒苡每梢杂迷?URL 編碼中的字符”。 每個(gè) Cookie 都有失效日期,一旦電腦的時(shí)鐘過了失效日期,這個(gè) Cookie 就會被刪掉。我們不能直接刪掉一個(gè) Cookie,但是可以用設(shè)定失效日期早于現(xiàn)在時(shí)刻的方法來間接刪掉它。 每個(gè)網(wǎng)頁,或者說每個(gè)站點(diǎn),都有它自己的 Cookies,這些 Cookies 只能由這個(gè)站點(diǎn)下的網(wǎng)頁來訪問,來自其他站點(diǎn)或同一站點(diǎn)下未經(jīng)授權(quán)的區(qū)域的網(wǎng)頁,是不能訪問的。每一“組”Cookies 有規(guī)定的總大?。ù蠹s 2KB 每“組”),一超過最大總大小,則最早失效的 Cookie 先被刪除,來讓新的 Cookie“安家”。 訪問Cookiedocument.write(document.cookie);//輸出類似"name1=value1; name2=value2; name3=value3"的字符串 document.write(typeof document.cookie);//cookie僅僅是個(gè)字符串
但這樣獲取到的是一堆混亂的字符串,必須對其進(jìn)行處理才能知道它的含義!在類似ASP或PHP這樣的服務(wù)器端腳本中,往往設(shè)置cookie十分簡單 //ASP response.cookies("cookieName")="cookieValue" //PHP setcookie("cookieName","cookieValue");
解析Cookie名值對方案一:直接截取字符串 function getCookie(cookieName) { var start = document.cookie.indexOf(cookieName+"="); if (start ==-1) {return "";} start = start+cookieName.length+1; var end = document.cookie.indexOf(";",start); if (end=-1) {end = document.cookie.length;} return document.cookie.substring(start,end); }
方案二:將Cookie拆分為數(shù)組,通過遍歷取得 function getCookie(cookieName) { var cookies=document.cookie.split("; ");//一個(gè)分號加一個(gè)空格 if (!cookies.length) {return "";} var pair=["",""]; for (var i=0;i< cookies.length;i++) { pair = cookies[i].split("=");//以賦值號分隔,第一位是Cookie名,第二位是Cookie值 if (pair[0]==cookieName) { break; } } return pair[1]; }
方案三:使用正則表達(dá)式解析 function getCookie(cookieName) { var re = new RegExp("\\b"+cookieName+"=([^;]*)\\b"); var arr = re.exec(document.cookie); return arr?arr[1]:""; }
設(shè)置Cookie一個(gè)Cookie包含以下信息:
注意:Cookie安全機(jī)制要求站點(diǎn)頁面只能訪問本站點(diǎn)的Cookie,不能訪問其它站點(diǎn)的Cookie。同時(shí),最好在設(shè)置Cookie時(shí)使用encodeURI對象進(jìn)行URI編碼,在取出Cookie時(shí)再使用decodeURI對其進(jìn)行解碼! 設(shè)置一個(gè)完整Cookie示例 var expires = new Date(); expires.setMonth(expires.getMonth()+1);//一個(gè)月后Cookie失效 document.cookie = "userName="+encodeURI("用戶名")+"; expires="+ expires.toGMTString()+"; path=/; domain=x-life.com; secure";
每次設(shè)置document.cookie值時(shí)如果該Cookie名稱并不存在,則新增一個(gè)Cookie,如果已經(jīng)存在,則修改以前的值! document.cookie ="a=1";//新增一個(gè)名稱為a的Cookie document.cookie = "b=2";//新增一個(gè)名稱為b的Cookie,原來的Cookie安然無恙 document.cookie = "a=3";//將原來的名稱為a的Cookie值修改為3
setCookie函數(shù) function setCookie(name,value,expires,domain,secure) { var str = name+"="+encodeURI(value);//不要忘了在對應(yīng)getCookie函數(shù)里面加上decodeURI方法 if (expires) { str += "; expires="+expires.toGMTString(); } if (path) { str += "; path="+path; } if (domain) { str += "; domain="+domain; } if (secure) { str += "; secure"; } document.cookie = str; }
刪除Cookie沒有刪除Cookie的直接的方法,但可以變通一下來刪除Cookie! function delCookie(cookieName) { var expires = new Date(); expires.setTime(expires.getTime()-1);//將expires設(shè)為一個(gè)過去的日期,瀏覽器會自動(dòng)刪除它 document.cookie = cookieName+"=; expires="+expires.toGMTString(); }
|
|