博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript读写cookie
阅读量:6336 次
发布时间:2019-06-22

本文共 4819 字,大约阅读时间需要 16 分钟。

  这篇介绍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 namefunction 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 neededfunction 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 datefunction 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 namefunction 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 neededfunction 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 datefunction 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";    }}

 

转载地址:http://rsxoa.baihongyu.com/

你可能感兴趣的文章
页面转向
查看>>
Coreos unit file特定变量
查看>>
初探AngularJS6.x---环境搭建
查看>>
网页更新爬虫如果应付
查看>>
postgresql 查询一段期间的数据(例如:三天)
查看>>
今天分享干货,如何写出好的文案
查看>>
工作十年+的测试应该具备什么能力?
查看>>
使用VMware创建虚拟机及安装Red Hat Linux 64位
查看>>
Mysql的存储过程、视图、函数、事件任务
查看>>
天津滨海农商行:用大数据建立风险预警系统提升服务中小微企业能力
查看>>
怎么将PPT转换成PDF
查看>>
Go For It ,一个灵活的待办事项列表程序
查看>>
程序员怎么学习C++?3大方法让你快速入门!
查看>>
web网络基础----Http详解
查看>>
POE供电详解
查看>>
拜托,面试别再问我跳表了!
查看>>
lucene 遍历所有term
查看>>
POJ 2418 Hardwood Species
查看>>
netflow v9
查看>>
zabbix企业应用之Mysql主从监控
查看>>