Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

JavaScript操作Cookie

  浏览器通常并没有提供setCookie这样的方法,而直接把document.cookie作成了一个Setter属性来使用。所以,我们对document.cookie赋值的时候实际上就是调用了setCookie(这个方法其实是不存在的哦,只有不过有这个功能而已),并把赋的值作为参数。设置Cookie的时候每次只能设置一个Cookie。 //这个就是最简单的写Cookie的例子
document.cookie="test=123";
//而下面这个只有a=1会被写入
document.cookie="a=1; b=2; c=3";
  为什么只有第一个会被写入呢?这是因为,设置在解析的时候,引擎把后面的b和c当作了a的后续参数了。由于设置Cookie的时候需要多个参数,所以每次只能设置一个Cookie,而设置Cookie的后续参数就用分号隔开放在设置Cookie的字符串中。下面这张图就是上面代码设置的Cookie

  Cookie有这么多个参数,上面的代码没设置这些参数,所以它们都是默认值。Domain的默认值是当前域名,Path的默认值是当前页面路径,Expires的默认值是Session,也就是浏览器关闭后自动释放。我们可以在设置Cookie的时候制定上这些值。 //当前域名 www.web-tinker.com
document.cookie="test=123";
document.cookie="test=123; Domain=web-tinker.com";
//这个不行
document.cookie="test=123; Domain=test.web-tinker.com";

  虽然可以设置Cookie的域名,但是也存在跨域问题。我们只能从子域给父域设置Cookie,其它一律禁止。比如上面这个例子就是在www.web-tinker.com下往web-tinker.com上设置Cookie。和给同是二级域名的test.web-tinker.com设置就失败了。而且我们也无法从父域给子域设置Cookie,因为那样会让安全性变得很糟糕。
  接下来是路径问题,也就是当前页面所在的目录。这就没有什么跨目录的问题了。同站点下的目录怎么设置都是允许的,不过最好也别乱设置,要不然访问的时候会变得麻烦起来。如果没有特殊需求,最好把一个站点下的Cookie都统一到主目录上。目录问题比较简单,我就不截图了。 //都是允许的
document.cookie="test=123; Path=/a";
document.cookie="test=123; Path=/b";
  最后是Expires参数,是用来设置Cookie的过期时间的。这个参数的用途很简单,关键在于时间格式。 //这个是无效的
document.cookie="test=123; Expires=2099-01-01 00:00:00";
  为什么无效呢!?因为时间这个东西比较特殊,一般认为过了国际日期变更线才算一天。那么如果在南北极的极点上呢?因为地球是球体,旋转的时候两个极点的位置是不变的,这就显然没办法使用国际日期变更线。再说国际空间站,它们根本不在地球上,那就没有时区的问题,它们的时间应该怎么计算呢?因此引入了格林威治时间(GMT时间)来解决时间地域性的问题。而Web是国际性的,所以显然是跨时区的,Cookie失效时间也不能按照一个国家本土的时间来计算,因此需要使用格林威治时间。因此上面的代码可以写成 document.cookie="test=123; Expires=Wed, 31 Dec 2098 16:00:00 GMT";   由于中国是+8时区,所以应该是GMT时间的减去8小时。也许你会觉得这个时间很麻烦(确实很麻烦),不过在JavaScript内置的Date对象中有提供toGMTString这个方法,可以直接调用它来生成GMT时间。 var s=new Date(2099,0,1).toGMTString();
alert(s);//Wed, 31 Dec 2098 16:00:00 GMT
  某些引擎也会对toGMTString方法输出协调世界时间(UTC时间)“Wed, 31 Dec 2098 16:00:00 UTC”它们基本上是一样的,由于地球的转速不均匀,导致日期偶尔会有非常微小的偏差。比如一个地震都会影响到千年以后的日期计算,所以需要不断修复这个偏差。UTC时间就是修复了这个偏差后的GMT时间,大多数时候它们都是一样的。就算有差异也不会超过1秒。所以考虑网络延迟等一些列因素,这个误差是可以忽略的。
  当Cookie超过了我们设置的时间,它就会被删除掉。由于Cookie本身没有提供删除的方法,所以删除Cookie也是利用这个超时,设置上一个过期的时间让它被删除掉。上面说的这几个参数,可以同时对一个Cookie使用,比如
s="test=123; "+
  "Expires=Wed, 31 Dec 2098 16:00:00 GMT; "+
  "Path=/b; "+
  "Domain=127.0.0.1";
document.cookie=s;
  好了,就到这儿吧~
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^