操縱Cookies
請(qǐng)記住,cookie就是文檔的一個(gè)字符串屬性。要保存cookie,只要建立一個(gè)字符串,格式是name=<value>(名稱(chēng)=值),然后把文檔的 document.cookie 設(shè)置成與它相等即可。比如,假設(shè)想保存表單接收到的用戶名,那么代碼看起來(lái)就象這樣:
document.cookie = "username" + escape(form.username.value);
在這里,使用 escape() 函數(shù)非常重要,因?yàn)閏ookie值里可能包含分號(hào)、逗號(hào)或者空格。這就是說(shuō),在讀取cookie值時(shí),必須使用對(duì)應(yīng)的unescape()函數(shù)給值解碼。
我們當(dāng)然還得介紹cookie的四個(gè)屬性。這些屬性用下面的格式加到字符串值后面:
name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]
名稱(chēng)=<值>[; expires=<日期>][; domain=<域>][; path=<路徑>][; 安全]
<value>, <date>, <domain> 和 <path> 應(yīng)當(dāng)用對(duì)應(yīng)的值替換。<date> 應(yīng)當(dāng)使用GMT格式,可以使用Javascript腳本語(yǔ)言的日期類(lèi)Date的.toGMTString() 方法得到這一GMT格式的日期值。方括號(hào)代表這項(xiàng)是可選的。比如在 [; secure]兩邊的方括號(hào)代表要想把cookie設(shè)置成安全的,就需要把"; secure" 加到cookie字符串值的后面。如果"; secure" 沒(méi)有加到cookie字符串后面,那么這個(gè)cookie就是不安全的。不要把尖括號(hào)<> 和方括號(hào)[] 加到cookie里(除非它們是某些值的內(nèi)容)。設(shè)置屬性時(shí),不限屬性,可以用任何順序設(shè)置。
下面是一個(gè)例子,在這個(gè)例子里,cookie "username" 被設(shè)置成在15分鐘之后過(guò)期,可以被服務(wù)器上的所有目錄訪問(wèn),可以被"mydomain.com"域里的所有服務(wù)器訪問(wèn),安全狀態(tài)為安全。
// Date() 的構(gòu)造器設(shè)置以毫秒為單位
// .getTime() 方法返回時(shí)間,單位為毫秒
// 所以要設(shè)置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值有點(diǎn)象個(gè)小把戲,因?yàn)槟阋淮尉偷玫搅藢儆诋?dāng)前文檔的所有cookies。
// 下面這個(gè)語(yǔ)句讀取了屬于當(dāng)前文檔的所有cookies
var allcookies = document.cookie;
現(xiàn)在,我們得解析allcookies變量里的不同cookies,找到感興趣的指定cookie。這個(gè)工作很簡(jiǎn)單,因?yàn)槲覀兛梢岳肑avascript語(yǔ)言提供的擴(kuò)展字符串支持。
如果我們對(duì)前面分配的cookie "username" 感興趣,可以用下面的腳本來(lái)讀取它的值。
// 我們定義一個(gè)函數(shù),用來(lái)讀取特定的cookie值。
function getCookie(cookie_name)
{
var allcookies = document.cookie;
var cookie_pos = allcookies.indexOf(cookie_name);
?// 如果找到了索引,就代表cookie存在,
?// 反之,就說(shuō)明不存在。
?if (cookie_pos != -1)
?{
??// 把cookie_pos放在值的開(kāi)始,只要給值加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;
}
// 調(diào)用函數(shù)
var cookie_val = getCookie("username");
上面例程里的 cookie_val 變量可以用來(lái)生成動(dòng)態(tài)內(nèi)容,或者發(fā)送給服務(wù)器端CGI腳本進(jìn)行處理。現(xiàn)在你知道了使用Javascript腳本操縱cookies的基本方法。但是,如果你跟我一樣,那么我們要做的第一件事,就是建立一些接口函數(shù),把cookies處理上的麻煩隱藏起來(lái)。不過(guò),在你開(kāi)始編程之前,稍候片刻。這些工作,早就有人替你做好了。你要做的,只是到哪去找這些接口函數(shù)而已。
比如,在David Flangan的Javascript: The Definitive Guide 3rd Ed.這本書(shū)里,可以找到很好的cookie應(yīng)用類(lèi)。你也可以在Oreilly的WEB站點(diǎn)上找到這本書(shū)里的例子。本文最后的鏈接列表里,有一些訪問(wèn)這些cookie示例的直接鏈接。
|