﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-天道</title><link>http://www.blogjava.net/shaojava/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:54:57 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:54:57 GMT</pubDate><ttl>60</ttl><item><title>js cookie总结</title><link>http://www.blogjava.net/shaojava/archive/2009/11/23/303307.html</link><dc:creator>java夜未眠</dc:creator><author>java夜未眠</author><pubDate>Mon, 23 Nov 2009 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/shaojava/archive/2009/11/23/303307.html</guid><wfw:comment>http://www.blogjava.net/shaojava/comments/303307.html</wfw:comment><comments>http://www.blogjava.net/shaojava/archive/2009/11/23/303307.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shaojava/comments/commentRss/303307.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shaojava/services/trackbacks/303307.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近需要用FSO操作文件，有这样一个需求，用js操纵cookie保存用户上次一打开文件的路径，发现用js操作cookie和用服务器语言操作cookie有一些差异，还有很多小的细节需要注意，如果运用不得当会引发很多不可预料的结果。当我遇到问题的时候在网上查了很多这方面的资料，发现好多都是简单以理论的方式介绍了js如何操作cookie。但我照着做却发现有些地方根本就不是这么回事，下面我总结了我在用js操作cookie的一些经验。
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用js操纵cookie是通过document对象下的cookie对象，其实document.cookie就是字符串，<br />
所以我们使用它就像使用字符串一样，可以使用字符串的所有方法，只不过这个字符串需要有个格式(key=value),设置cookie的示例代码如下</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="key=escape(value)";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookie的值不能使用分号（;）、逗号（,）、等号（=）以及空格。在cookie的名中做到这点很容易，但要保存的值是不确定的。如何来存储这些值呢？方 法是用escape()函数进行编码，它能将一些特殊符号使用十六进制表示，例如空格将会编码为&#8220;20%&#8221;，从而可以存储于cookie值中，而且使用此 种方案还可以避免中文乱码的出现。value上使用了escape方法。在取值的时候需要unescape(value)对value再进行转码即可。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想设置多个cookie需要多次使用这样的方法。正确的设置方法是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="key=escape(value)";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="key1=escape(value1)"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而不是<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="key=escape(value);key1=escape(value1)";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果想取出cookie的值，可以直接调用document.cookie获得，如果有多个值，多个值用分号(;)分隔，每个值用等号(=)分隔，我们可以对cookie先按照分号(;)进行分隔(split)，然后再按等号(=)分隔(split)。然后循环比较key的值，如果key相等，则取出value。需要注意一点，如果有多个值，第二个值的key值前面多一个空格，需要去除。下面我给出获取cookie的示例代码</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function getCookie(key){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var aCookie = document.cookie.split(";");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i=0; i &lt; aCookie.length; i++){&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var aCrumb = aCookie[i].split("=");&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (key === aCrumb[0].replace(/^\s*|\s*$/,"")){&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return unescape(aCrumb[1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过前面的示例代码在一个页面设置cookie后在这个页面也能取到，但是cookie存在哪里了。通常情况下，cookie会存放在C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files目录下。但是我们删除了这个文件夹下的所有文件后，再获得cookie,还能够访问到。关闭浏览器后，再次打开浏览器后还能获得到cookie。那cookie的默认生存期是多久呢。怎么才能清除cookie呢。非常抱歉，我也不知道存哪了，但是只要注销或重启之后，设置的cookie将销毁。我个人认为这是设计js的cookie的一个bug.因为用户不能够通过一种方式及时清除cookie是非常不友好的。我们可以通过设置cookie时可以传递一个属性expires，该属性的作用是设置cookie的生存期。设置cookie的生存期的示例代码如下：</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var liveDate = new Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; liveDate.setTime(liveDate.getTime() + 3*24*60*60*1000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="name=test;expires=" + liveDate.toGMTString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面代码设置cookie的name的存活时间为3天。删除cookie的值就是设置expires一个过期的时间即可，示例代码如下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var liveDate = new Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; liveDate.setTime(liveDate.getTime() - 10000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie = "name=test;expires=" + date.toGMTString();</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是有趣的是，设置了expires属性后，我们在C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files目录下发现有存储cookie的文件。此时我们删除该文件后，发现设置的cookie确实销毁了。这正符合我们的要求。所以建议用js设置cookie的时候一定要设置expires属性，正常来说我们要用到cookie的时候就应该根据需求明确设计cookie存活多久。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面我们再说一下js操作cookie的作用域。默认情况下js操作cookie的作用域是目录级的，也就是在当前目录下设置的cookie，当前目录及该目录下的所有子目录下的所有文件都能够访问该cookie,例如在<a href="http://10.4.107.163:8090/APPTest/aaa/testCookie.html" target="_blank" eventslistuid="e3">http://localhost:8090/APPTest/aaa/testCookie.html</a>中设置的cookie,在<a href="http://10.4.107.163:8090/APPTest/aaa/" target="_blank" eventslistuid="e4">http://localhost:8090/APPTest/aaa/</a>目录下的所有文件和<a href="http://10.4.107.163:8090/APPTest/aaa/bbb/" target="_blank" eventslistuid="e5">http://localhost:8090/APPTest/aaa/bbb/</a>下的所有文件都能够访问到这个cookie,而在<a href="http://10.4.107.163:8090/APPTest/" target="_blank" eventslistuid="e6">http://localhost:8090/APPTest/</a>目录下的文件就不能够访问该cookie。设置cookie时有一个path属性能够改变cookie的有效访问路径。但是目前path只能设置一个参数即"/",代表是根路径。示例代码如下：</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="key=escape(value);path=/";</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果设置了path="/"，则不管设置cookie在哪个路径，在<a href="http://10.4.107.163:8090/APPTest/" target="_blank" eventslistuid="e7">http://localhost:8090/APPTest/</a><br />
下及所有目录及子目录下都能够访问到这个cookie.理论上如果设置path="\aaa",该cookie的作用域应该是aaa目录下及aaa目录下的所有子目录下都能够访问到这个cookie,但实际上并没有实现这样的功能，我认为这也是js实现cookie的一个bug。这里有两个问题需要注意，一是如果设置两个同名的cookie,如<a href="http://10.4.107.163:8090/APPTest/aaa/" target="_blank" eventslistuid="e8">http://localhost:8090/APPTest/aaa/</a>下设置了两个cookie,一个设置了path为"/"，另一个cookie不带path参数,那么在<a href="http://10.4.107.163:8090/APPTest/aaa/" target="_blank" eventslistuid="e9">http://localhost:8090/APPTest/aaa/</a>会访问到两个同名的cookie值，而在路径为<a href="http://10.4.107.163:8090/APPTest/" target="_blank" eventslistuid="e10">http://localhost:8090/APPTest/</a>只能访问到全局的cookie值。但是我们没有办法通过路径去区分。第二个需要注意的就是删除cookie,如果设置cookie时带path属性，那么在删除的时候一定要加上path属性，否则删除的是当前目录下设置的cookie值。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外在设置cookie时还能够设置两个属性，分别是domain和secure，domain代表设置cookie的访问域，下面我给出domain基本理论。<br />
例如：<a href="http://www.google.com/" target="_blank" eventslistuid="e11">www.google.com</a>和gmail.google.com就是两个不同的主机名。默认情况下，一个主机中创建的cookie在另一个主机下是不能被访问的，但可以通过domain参数来实现对其的控制，其语法格式为： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="name=value;domain=cookieDomain"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以google为例，要实现跨主机访问，可以写为： <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.cookie="name=value;domain=.google.com"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，所有google.com下的主机都可以访问该cookie。 因为这个参数我没有测试过也没有用过，所以如果当用到这个参数，可以参考上面的理论部分。</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; secure代表该cookie是否是安全的。如果设置了该属性，只有使用https协议才能够访问到<br />
该cookie.</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面给出cookie的完整格式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&lt;value&gt;[; expires=&lt;date&gt;][; domain=&lt;domain&gt;][; path=&lt;path&gt;][; secure]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 名称=&lt;值&gt;[; expires=&lt;日期&gt;][; domain=&lt;域&gt;][; path=&lt;路径&gt;][; 安全]</p>
<img src ="http://www.blogjava.net/shaojava/aggbug/303307.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shaojava/" target="_blank">java夜未眠</a> 2009-11-23 11:09 <a href="http://www.blogjava.net/shaojava/archive/2009/11/23/303307.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>