用jsæ“纵cookie是通过document对象下的cookie对象åQŒå…¶å®ždocument.cookiež®±æ˜¯å—符ä¸ÔŒ¼Œ
所以我们ä‹É用它?y¨u)®±åƒä½¿ç”¨å—ç¬¦ä¸²ä¸€æ øP¼Œå¯ä»¥ä½¿ç”¨å—符串的所有方法,åªä¸˜q‡è¿™ä¸ªå—½W¦ä¸²éœ€è¦æœ‰ä¸ªæ ¼å¼?key=value),讄¡½®cookie的示例代ç 如ä¸?/p>
document.cookie="key=escape(value)";
cookieçš„å€ég¸èƒ½ä‹É用分åøP¼ˆ;åQ‰ã€é€—å·åQ?åQ‰ã€ç‰åøP¼ˆ=åQ‰ä»¥å?qi¨¢ng)ç©ºæ ¹{€‚在cookieçš„åä¸åšåˆ°è¿™ç‚¹å¾ˆå®ÒŽ(gu¨©)˜“åQŒä½†è¦ä¿å˜çš„值是ä¸ç¡®å®šçš„。如何æ¥å˜å‚¨˜q™äº›å€¼å‘¢åQŸæ–¹ 法是用escape()函数˜q›è¡Œ¾~–ç åQŒå®ƒèƒ½å°†ä¸€äº›ç‰¹ŒDŠç¬¦å·ä‹É用åå…进制表½Cºï¼Œä¾‹å¦‚½Iºæ ¼ž®†ä¼š(x¨¬)¾~–ç ä¸?#8220;20%”åQŒä»Žè€Œå¯ä»¥å˜å‚¨äºŽcookieå€ég¸åQŒè€Œä¸”使用æ?¿U方案还å¯ä»¥é¿å…䏿–‡ä¹Þq 的出现。value上ä‹É用了escapeæ–ÒŽ(gu¨©)³•。在å–值的时候需è¦unescape(value)对valueå†è¿›è¡Œè{ç å³å¯ã€?/p>
如果惌™®¾¾|®å¤šä¸ªcookie需è¦å¤š‹Æ¡ä‹É用这æ ïL(f¨¥ng)š„æ–ÒŽ(gu¨©)³•。棼‹®çš„讄¡½®æ–ÒŽ(gu¨©)³•是:(x¨¬)
document.cookie="key=escape(value)";
document.cookie="key1=escape(value1)"
è€Œä¸æ˜?br />
document.cookie="key=escape(value);key1=escape(value1)";
如果惛_–出cookieçš„å€û|¼Œå¯ä»¥ç›´æŽ¥è°ƒç”¨document.cookie获得åQŒå¦‚果有多个å€û|¼Œå¤šä¸ªå€¼ç”¨åˆ†å·(;)分隔åQŒæ¯ä¸ªå€¼ç”¨½{‰å·(=)分隔åQŒæˆ‘们å¯ä»¥å¯¹cookie先按照分å?;)˜q›è¡Œåˆ†éš”(split)åQŒç„¶åŽå†æŒ‰ç‰å?=)分隔(split)。然åŽåó@环比较keyçš„å€û|¼Œå¦‚æžœkey相ç‰åQŒåˆ™å–出valueã€‚éœ€è¦æ³¨æ„一点,如果有多个å€û|¼Œ½W¬äºŒä¸ªå€¼çš„key值å‰é¢å¤šä¸€ä¸ªç©ºæ û|¼Œéœ€è¦åŽ»é™¤ã€‚ä¸‹é¢æˆ‘¾l™å‡ºèŽ·å–cookie的示例代ç ?/p>
function getCookie(key){
var aCookie = document.cookie.split(";");
for (var i=0; i < aCookie.length; i++){
var aCrumb = aCookie[i].split("=");
if (key === aCrumb[0].replace(/^\s*|\s*$/,"")){
return unescape(aCrumb[1]);
}
}
}
¾l过å‰é¢çš„示例代ç 在一个页é¢è®¾¾|®cookieåŽåœ¨˜q™ä¸ª™åµé¢ä¹Ÿèƒ½å–到åQŒä½†æ˜¯cookieå˜åœ¨å“ªé‡Œäº†ã€‚通常情况下,cookieä¼?x¨¬)å˜æ”‘Öœ¨C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Filesç›®å½•ä¸‹ã€‚ä½†æ˜¯æˆ‘ä»¬åˆ é™¤äº†˜q™ä¸ªæ–‡äšg夹下的所有文件åŽåQŒå†èŽ·å¾—cookie,˜q˜èƒ½å¤Ÿè®¿é—®åˆ°ã€‚关闿µè§ˆå™¨åŽï¼Œå†æ¬¡æ‰“å¼€‹¹è§ˆå™¨åŽ˜q˜èƒ½èŽ·å¾—åˆ°cookie。那cookieçš„é»˜è®¤ç”Ÿå˜æœŸæ˜¯å¤šä¹…呢。怎么æ‰èƒ½æ¸…除cookie呢。éžå¸¸æŠ±æ‰ï¼Œæˆ‘也ä¸çŸ¥é“å˜å“ªäº†åQŒä½†æ˜¯åªè¦æ³¨é”€æˆ–é‡å¯ä¹‹åŽï¼Œè®„¡½®çš„cookiež®†é”€æ¯ã€‚我个ähè®¤äØ“(f¨´)˜q™æ˜¯è®¾è®¡jsçš„cookie的一个bug.å› äØ“(f¨´)用户ä¸èƒ½å¤Ÿé€šè¿‡ä¸€¿Uæ–¹å¼åŠ(qi¨¢ng)时清除cookie是éžå¸æ€¸å‹å¥½çš„。我们å¯ä»¥é€šè¿‡è®„¡½®cookieæ—¶å¯ä»¥ä¼ 递一个属性expiresåQŒè¯¥å±žæ€§çš„作用是设¾|®cookieçš„ç”Ÿå˜æœŸã€‚设¾|®cookieçš„ç”Ÿå˜æœŸçš„示例代ç 如下:(x¨¬)
var liveDate = new Date();
liveDate.setTime(liveDate.getTime() + 3*24*60*60*1000);
document.cookie="name=test;expires=" + liveDate.toGMTString();
上é¢ä»£ç 讄¡½®cookieçš„nameçš„å˜?g¨°u)zÀL—¶é—´äØ“(f¨´)3å¤©ã€‚åˆ é™¤cookie的值就是设¾|®expires一个过期的旉™—´å›_¯åQŒç¤ºä¾‹ä»£ç 如ä¸?br />
var liveDate = new Date();
liveDate.setTime(liveDate.getTime() - 10000);
document.cookie = "name=test;expires=" + date.toGMTString();
但是有趣的是åQŒè®¾¾|®äº†expires属性åŽåQŒæˆ‘们在C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files目录下å‘现有å˜å‚¨cookieçš„æ–‡ä»¶ã€‚æ¤æ—¶æˆ‘ä»¬åˆ é™¤è¯¥æ–‡äšgåŽï¼Œå‘现讄¡½®çš„cookie¼‹®å®žé”€æ¯äº†ã€‚è¿™æ£ç¬¦åˆæˆ‘ä»¬çš„è¦æ±‚。所以å¾è®®ç”¨js讄¡½®cookie的时候一定è¦è®„¡½®expires属性,æ£å¸¸æ¥è¯´æˆ‘们è¦ç”¨åˆ°cookie的时候就应该æ ÒŽ(gu¨©)®éœ€æ±‚明¼‹®è®¾è®¡cookieå˜æ´»å¤šä¹…ã€?/p>
䏋颿ˆ‘们å†è¯´ä¸€ä¸‹jsæ“作cookie的作用域。默认情况下jsæ“作cookie的作用域是目录çñ”的,也就是在当å‰ç›®å½•下设¾|®çš„cookieåQŒå½“å‰ç›®å½•åŠ(qi¨¢ng)该目录下的所有å目录下的所有文仉™ƒ½èƒ½å¤Ÿè®‰K—®è¯¥cookie,例如åœ?a target="_blank" eventslistuid="e3">http://localhost:8090/APPTest/aaa/testCookie.htmlä¸è®¾¾|®çš„cookie,åœ?a target="_blank" eventslistuid="e4">http://localhost:8090/APPTest/aaa/目录下的所有文件和http://localhost:8090/APPTest/aaa/bbb/下的所有文仉™ƒ½èƒ½å¤Ÿè®‰K—®åˆ°è¿™ä¸ªcookie,而在http://localhost:8090/APPTest/目录下的文äšgž®×ƒ¸èƒ½å¤Ÿè®‰K—®è¯¥cookie。设¾|®cookie时有一个path属性能够改å˜cookie的有效访问èµ\径。但是目å‰pathåªèƒ½è®„¡½®ä¸€ä¸ªå‚æ•°å³"/",ä»£è¡¨æ˜¯æ ¹è·¯å¾„ã€‚ç¤ºä¾‹ä»£ç 如下:(x¨¬)
document.cookie="key=escape(value);path=/";
如果讄¡½®äº†path="/"åQŒåˆ™ä¸ç®¡è®„¡½®cookie在哪个èµ\径,åœ?a target="_blank" eventslistuid="e7">http://localhost:8090/APPTest/
下åŠ(qi¨¢ng)所有目录åŠ(qi¨¢ng)å目录下都能够访问到˜q™ä¸ªcookie.ç†è®ºä¸Šå¦‚果设¾|®path="\aaa",该cookie的作用域应该是aaa目录下åŠ(qi¨¢ng)aaa目录下的所有å目录下都能够讉K—®åˆ°è¿™ä¸ªcookie,但实际上òq¶æ²¡æœ‰å®žçŽ°è¿™æ ïL(f¨¥ng)š„功能åQŒæˆ‘è®¤äØ“(f¨´)˜q™ä¹Ÿæ˜¯js实现cookie的一个bugã€‚è¿™é‡Œæœ‰ä¸¤ä¸ªé—®é¢˜éœ€è¦æ³¨æ„,一是如果设¾|®ä¸¤ä¸ªåŒåçš„cookie,å¦?a target="_blank" eventslistuid="e8">http://localhost:8090/APPTest/aaa/下设¾|®äº†ä¸¤ä¸ªcookie,一个设¾|®äº†pathä¸?/"åQŒå¦ä¸€ä¸ªcookieä¸å¸¦path傿•°,那么åœ?a target="_blank" eventslistuid="e9">http://localhost:8090/APPTest/aaa/ä¼?x¨¬)访问到两个åŒåçš„cookieå€û|¼Œè€Œåœ¨è·¯å¾„ä¸?a target="_blank" eventslistuid="e10">http://localhost:8090/APPTest/åªèƒ½è®‰K—®åˆ°å…¨å±€çš„cookie倹{€‚但是我们没有办法通过路径åŽÕdŒºåˆ†ã€‚ç¬¬äºŒä¸ªéœ€è¦æ³¨æ„çš„ž®±æ˜¯åˆ 除cookie,如果讄¡½®cookie时带pathå±žæ€§ï¼Œé‚£ä¹ˆåœ¨åˆ é™¤çš„æ—¶å€™ä¸€å®šè¦åŠ ä¸Špath属性,å¦åˆ™åˆ 除的是当å‰ç›®å½•下设¾|®çš„cookie倹{€?/p>
å¦å¤–在设¾|®cookie时还能够讄¡½®ä¸¤ä¸ªå±žæ€§ï¼Œåˆ†åˆ«æ˜¯domainå’ŒsecureåQŒdomain代表讄¡½®cookie的访问域åQŒä¸‹é¢æˆ‘¾l™å‡ºdomain基本ç†è®ºã€?br />
例如åQ?a target="_blank" eventslistuid="e11">www.google.comå’Œgmail.google.comž®±æ˜¯ä¸¤ä¸ªä¸åŒçš„主机å。默认情况下åQŒä¸€ä¸ªä¸»æœÞZ¸åˆ›å¾çš„cookie在å¦ä¸€ä¸ªä¸»æœÞZ¸‹æ˜¯ä¸èƒ½è¢«è®‰K—®çš„,但å¯ä»¥é€šè¿‡domain傿•°æ¥å®žçŽ°å¯¹å…¶çš„æŽ§åˆ¶åQŒå…¶è¯æ³•æ ¼å¼ä¸ºï¼š(x¨¬)
document.cookie="name=value;domain=cookieDomain";
以googleä¸ÞZ¾‹åQŒè¦å®žçŽ°è·¨ä¸»æœø™®¿é—®ï¼Œå¯ä»¥å†™äØ“(f¨´)åQ?
document.cookie="name=value;domain=.google.com";
˜q™æ ·åQŒæ‰€æœ‰google.com下的ä¸ÀLœºéƒ½å¯ä»¥è®¿é—®è¯¥cookieã€?å› äØ“(f¨´)˜q™ä¸ªå‚数我没有测试过也没有用˜q‡ï¼Œæ‰€ä»¥å¦‚果当用到˜q™ä¸ªå‚æ•°åQŒå¯ä»¥å‚考上é¢çš„ç†è®ºéƒ¨åˆ†ã€?/p>
secure代表该cookieæ˜¯å¦æ˜¯å®‰å…¨çš„。如果设¾|®äº†è¯¥å±žæ€§ï¼Œåªæœ‰ä½¿ç”¨httpsåè®®æ‰èƒ½å¤Ÿè®¿é—®åˆ°
该cookie.
下颾l™å‡ºcookieçš„å®Œæ•´æ ¼å¼?br />
name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]
åç§°=<å€?gt;[; expires=<日期>][; domain=<åŸ?gt;][; path=<路径>][; 安全]