谨记:Cookie的作用域不区分协议和端口
本文由 小茗同学 发表于 2020-05-12 浏览(90)
最后修改 2020-05-12 标签:cookie

误区一:是否区分协议和端口

受阮一峰某篇博客里面错误描述影响:

网上大把的文章都说Cookie作用域由protocol、domain、和port决定,实际上这是大错特错的,比如下面这位同学,有人在网上问“cookie作用域区分协议和端口吗”,然后他像贴圣旨一样把阮一峰博客的截图贴一下:

这篇博客是它16年写的,尽管评论里面有很多人指出来这个地方写错了,但他时至今日仍没有更正过来。

测试

其实到底与协议和端口是否有关,测试一下不就好了么,准备如下页面:

经测试,随便在哪个页面下执行document.cookie = 'test=aaa'后,其它页面都可以看到这个cookie。

结论

一句话:Cookie的作用域仅仅由domainpath决定,与协议端口无关。

误区二:子域名共享的实现

阮一峰博客里面还提到,为了实现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
},