1、CookieCookie 基础知识我们已经知道,在 document 对象中有一个 cookie 属性。但是 Cookie 又是什么?“某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为 Cookie。” MSIE 帮助。一般来说,Cookies 是 CGI 或类似,比 HTML 高级的文件、程序等创建的,但是 JavaScript 也提供了对 Cookies 的很全面的访问权利。在继续之前,我们先要学一学 Cookie 的基本知识。每个 Cookie 都是这样的:cookie 名=cookie 值;cookie 本身仅仅是一个字符串,是一组名值对;多组名值对用分号加
2、空格分隔!“cookie 名“的限制与 JavaScript 的命名限制大同小异,少了“不能用 JavaScript 关键字”,多了“只能用可以用在 URL 编码中的字符”。后者比较难懂,但是只要你只用字母和数字命名,就完全没有问题了。“值”的要求也是“只能用可以用在 URL 编码中的字符”。每个 Cookie 都有失效日期,一旦电脑的时钟过了失效日期,这个 Cookie 就会被删掉。我们不能直接删掉一个 Cookie,但是可以用设定失效日期早于现在时刻的方法来间接删掉它。每个网页,或者说每个站点,都有它自己的 Cookies,这些 Cookies 只能由这个站点下的网页来访问,来自其他站点或
3、同一站点下未经授权的区域的网页,是不能访问的。每一“组”Cookies 有规定的总大小(大约 2KB 每“组”),一超过最大总大小,则最早失效的 Cookie 先被删除,来让新的 Cookie“安家”。访问 Cookiedocument.write(document.cookie);/输出类似“name1=value1; name2=value2; name3=value3“的字符串document.write(typeof document.cookie);/cookie 仅仅是个字符串但这样获取到的是一堆混乱的字符串,必须对其进行处理才能知道它的含义!在类似 ASP 或 PHP 这样的服务
4、器端脚本中,往往设置 cookie 十分简单/ASPresponse.cookies(“cookieName“)=“cookieValue“/PHPsetcookie(“cookieName“,“cookieValue“);解析 Cookie 名值对方案一:直接截取字符串function getCookie(cookieName) var start = document.cookie.indexOf(cookieName+“=“);if (start =-1) return “;start = start+cookieName.length+1;var end = document.cook
5、ie.indexOf(“;“,start);if (end=-1) end = document.cookie.length;return document.cookie.substring(start,end);方案二:将 Cookie 拆分为数组,通过遍历取得function getCookie(cookieName) var cookies=document.cookie.split(“; “);/一个分号加一个空格if (!cookies.length) return “;var pair=“,“;for (var i=0;i cookies.length;i+) pair = coo
6、kiesi.split(“=“);/以赋值号分隔,第一位是 Cookie 名,第二位是 Cookie 值if (pair0=cookieName) break;return pair1;方案三:使用正则表达式解析function getCookie(cookieName) var re = new RegExp(“b“+cookieName+“=(;*)b“);var arr = re.exec(document.cookie);return arr?arr1:“;设置 Cookie一个 Cookie 包含以下信息: Cookie 名称,Cookie 名称必须使用只能用在 URL 中的字符,一
7、般用字母及数字 Cookie 值,Cookie 值同样也只能使用可以用在 URL 中的字符,一般需要在设置 Cookie 值时对其使用 encodeURI 方法进行转义 Expires,过期日期,一个 GMT 格式的时间,当过了这个日期之后,浏览器就会将这个 Cookie 删除掉,当不设置这个的时候,Cookie 在浏览器关闭后消失 Path,一个路径,在这个路径下面的页面才可以访问该 Cookie,一般设为“/”,以表示同一个站点的所有页面都可以访问这个 Cookie Domain,子域,指定在该子域下才可以访问 Cookie,例如要让 Cookie在 bbs.x- 下可以访问,但在 new
8、s.x- 下不能访问,则可将 domain 设置成 bbs.x- Secure,安全性,指定 Cookie 是否只能通过 https 协议访问,一般的Cookie 使用 HTTP 协议既可访问,如果设置了 Secure(没有值),则只有当使用 https 协议连接时 cookie 才可以被页面访问 注意:Cookie 安全机制要求站点页面只能访问本站点的 Cookie,不能访问其它站点的 Cookie。同时,最好在设置 Cookie 时使用 encodeURI 对象进行 URI编码,在取出 Cookie 时再使用 decodeURI 对其进行解码! 设置一个完整 Cookie 示例var ex
9、pires = new Date();expires.setMonth(expires.getMonth()+1);/一个月后 Cookie 失效document.cookie = “userName=“+encodeURI(“用户名“)+“; expires=“+expires.toGMTString()+“; path=/; domain=x-; secure“;每次设置 document.cookie 值时如果该 Cookie 名称并不存在,则新增一个Cookie,如果已经存在,则修改以前的值!document.cookie =“a=1“;/新增一个名称为 a 的 Cookiedocum
10、ent.cookie = “b=2“;/新增一个名称为 b 的 Cookie,原来的 Cookie 安然无恙document.cookie = “a=3“;/将原来的名称为 a 的 Cookie 值修改为 3setCookie 函数function setCookie(name,value,expires,domain,secure) var str = name+“=“+encodeURI(value);/不要忘了在对应 getCookie 函数里面加上 decodeURI 方法if (expires) str += “; expires=“+expires.toGMTString();if
11、 (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 设为一个过去的日期,浏览器会自动删除它document.cookie = cookieName+“=; expires=“+expires.toGMTString();