误区一:是否区分协议和端口
受阮一峰某篇博客里面错误描述影响:
网上大把的文章都说Cookie作用域由protocol、domain、和port决定,实际上这是大错特错的,比如下面这位同学,有人在网上问“cookie作用域区分协议和端口吗”,然后他像贴圣旨一样把阮一峰博客的截图贴一下:
这篇博客是它16年写的,尽管评论里面有很多人指出来这个地方写错了,但他时至今日仍没有更正过来。
测试
其实到底与协议和端口是否有关,测试一下不就好了么,准备如下页面:
经测试,随便在哪个页面下执行document.cookie = 'test=aaa'
后,其它页面都可以看到这个cookie。
结论
一句话:Cookie的作用域仅仅由domain
和path
决定,与协议
和端口
无关。
误区二:子域名共享的实现
阮一峰博客里面还提到,为了实现cookie的不同子域名贡献,他提到了通过修改document.domain = 'test.com'
这种投机取巧的方法来实现,其实完全不需要这样麻烦,cookie本身就支持设置domain的啊,大哥!
/**
* 设置cookie,对于中文和特殊字符必须先进行编码
* @param name cookie名称
* @param value cookie内容,注意cookie内容不能有分号、逗号、等号、空格等特殊字符,中文就更不可以,所以注意使用escape
* @param day cookie失效天数,默认30天
* @param path cookie的作用范围,默认“/”
* @param domain cookie作用域名,如果不传则默认当前域名,否则,只要你传了,不管你前面是否加点,最终生效的一定会加点,域名只能<=当前域名,比如当前是 blog.test.com,可以传 test.com 或者 .test.com
*/
function setCookie (name, value, day, path, domain)
{
day = day || 30;
path = path || '/';
var str = name + '=' + encodeURIComponent(value) + '; ';
if(day) str += 'expires=' + new Date(Date.now() + day * 24 * 3600 * 1000).toGMTString() + '; ';
if(path) str += 'path=' + path + '; ';
if(domain) str += 'domain=' + domain;
document.cookie = str;//注意,cookie这样设置并不会覆盖之前所有的cookie!除非同名同path
},