这篇介绍javascript里面读写cookie的方法。这个方法不是自己写的,大家都知道,做东西的时候很少自己去写底层的东西,但不写一定要去了解,要不然出了问题就不知所云了。了解这些方法可以分步来了解:
document.cookie:不要把这个想的很复杂,其实就是一个用“; ”分隔(注意是一个分号和一个空格)的成对的name1=value1;name2=value2... ...字符串,w3c上这样解释它:该属性是一个可读可写的字符串,可使用该属性对当前文档的 cookie 进行读取、创建、修改和删除操作。
下面的3个方法都是围绕着这个对象来进行的。如果你使用的是火狐浏览器且安装了firebug插件且安装了firecookie插件,现在可以点击Cookies标签查看,如下图1
图1
这里我们看到的并不是一个字符串,是因为为了显示方便firecookie将他们做了分隔。我们可以点击控制台标签,在右方命令编辑器中输入document.cookie,点击运行,在左方的输出中皆可以看到cookie的值了,如图2中的红色字体。顺便说一下firebug超级方便,在控制台中可以运行命令行,也可以运行多行命令,在最右下方有一个红色的小按钮,可以在两种方式之间相互切换。
图2
下面接着看这个方法,它其实就是在上面的字符串中找到“__utma=”这样的一个字符串的位置,然后从“=”后面开始计算,找到分隔符“;”然后截取他,就是这个cookie项的值了。这里解释一下几个关键变量:
arg:是类似于"__utma"这样一个字符串,也就是查找要查找的cookie的名字加上一个"="
alen:是上面cookie名字加上“=”的字符串长度
clen:是整个cookie字符串的长度
i:初始值为0,每次循环时设置成当前位置加上alen,当前位置就是从name开始的位置
j:初始值为0,每次循环时设置成value结束的位置
stringObject.substring(start,stop):
start 必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。
stop 可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多1。如果省略该参数,那么返回的子串会一直到字符串的结尾。
stringObject.indexOf(searchvalue,fromindex):
searchvalue 必需。规定需检索的字符串值。
fromindex 可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的首字符开始检索。
以上是getcookie方法的逻辑,下面是setCookie,注意这里的setcookie并没有修改整个cookie字符串的值,而是新添加一个cookie,这个方法没有什么逻辑,但是要注意里面的参数,要不然会带来很多的问题,下面一一列举。
name:要设置的cookie的名字
expires:cookie的过期时间,如果没有这个参数的话,注意这里要使用格林威治时间,没有给给出这个参数,就不会保存到硬盘中而是内存中,这样上面的过期时间就不会显示,而是显示成会话,如下图3
path:这个参数表示cookie保存的路径,如果没有给出的话会保存为当前站点的,如果给出值"/"的话会保存到当前虚拟目录,如图3,前面两个保存在当前站点,后面两个保存在当前站点下不同的虚拟目录下
domain:这个参数有点类似于session的保存路径,默认情况下保存在当前客户端,也可以保存在其他有写权限的机器上,本人暂时没有用到
secure:这个参数应该和安全有关,也没有用到,因为一般保存到cookie数据都是一些搜索历史之类的
图3
注意这里我们使用escape和unescape对cookie的值进行编码和解码。
escape(string):escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
unescape(string) :unescape() 函数可对通过 escape() 编码的字符串进行解码。该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。
这里说个题外话,我们知道session和cookie关系密切,每个session都有一个sessionid,这个sessionid也是保存在cookie中,名字叫ASP.NET_SessionId,见图3,我们可以看到这是一个会话cookie,并不是保存在硬盘中,没有过期时间,所以一段关闭浏览器,session就消失了,再打开浏览器的时候就找不到session值了,就是因为这个sessionid丢失了。如果将用户登陆账号保存在session中,关闭浏览器登录状态就会消失,需要重新登录,就是这个原因。
最后看一下这两个函数的原型。
// utility function called by getCookie() function getCookieVal(offset) { var endstr = document.cookie.indexOf(";", offset); if (endstr == -1) { endstr = document.cookie.length; } return unescape(document.cookie.substring(offset, endstr)); } // primary function to retrieve cookie by name function getCookie(name) { var arg = name + "="; var alen = arg.length; var clen = document.cookie.length; var i = 0; while (i < clen) { var j = i + alen; if (document.cookie.substring(i, j) == arg) { return getCookieVal(j); } i = document.cookie.indexOf(" ", i) + 1; if (i == 0) break; } return null; } // store cookie value with optional details as needed function setCookie(name, value, expires, path, domain, secure) { document.cookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); } // remove the cookie by setting ancient expiration date function deleteCookie(name, path, domain) { if (getCookie(name)) { document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-1970 00:00:01 GMT"; } } // utility function called by getCookie() function getCookieVal(offset) { var endstr = document.cookie.indexOf(";", offset); if (endstr == -1) { endstr = document.cookie.length; } return unescape(document.cookie.substring(offset, endstr)); } // primary function to retrieve cookie by name function getCookie(name) { var arg = name + "="; var alen = arg.length; var clen = document.cookie.length; var i = 0; while (i < clen) { var j = i + alen; if (document.cookie.substring(i, j) == arg) { return getCookieVal(j); } i = document.cookie.indexOf(" ", i) + 1; if (i == 0) break; } return null; } // store cookie value with optional details as needed function setCookie(name, value, expires, path, domain, secure) { document.cookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); } // remove the cookie by setting ancient expiration date function deleteCookie(name, path, domain) { if (getCookie(name)) { document.cookie = name + "=" + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-1970 00:00:01 GMT"; } }
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过以下邮箱地址williamningdong@gmail.com 联系我,非常感谢。