cookie中的domain设置

项目中遇到这样一个问题:用户登录后,跳转到该域名下的其他页面时,cookie的值改变了。由于是在app中,只能抓包,看到请求header头中有两个同名cookie。而在服务端,超全局变量cookie数组,只取了第一个cookie。由于项目变动,重新设置cookie时只设置了当前域名下的cookie,所以旧的cookie永远无法清除。

这种问题,其实如果基础好一点,对cookie足够了解,是很快能够解决的。由于很久不写这些基础,所以还是花了很长时间。因为当时无法确定cookie的domain和path,所以只能靠猜去清除cookie。

虽然通过git log找到原先设置cookie的域名成功清除了旧cookie,但是如果早点看资料,应该并不难解决。(看文档胜过一切)

对于cookie只需要牢记两点:设置范围作用域
- 设置范围:只能设置当前域名以及父域名(无法设置子域或者同级域名)
- 作用域:当前域名以及所有子域名

举个简单的例子:
对于域名 test.com,在访问a.test.com时,只能设置domain为a.test.com或者test.com;如果设置domain为a.test.com,则child.a.test.comtool.child.a.test.com等都是能够访问到该cookie的。而b.test.com是无法访问到的。

如果设置domain为test.com,则a.test.com以及test.com下的所有子域名都能访问下,这意味着它的同级域名b.test.com也能够访问到。有什么用呢?

这样可以用来解决sso单点登录或者跨域cookie等问题。当然,现在的单点登录一般是通过返回的ticket凭证到服务端做校验去获取信息。

比如,对于a.test.comb.test.com两个项目,公用user.test.com用户系统做单点登录,可以通过设置domain为test.com,在user退出的时候清除根域名下的cookie以达到协同退出的功能。

回到上面的问题:所以在当前域名无法清除cookie的时候,只可能是它的上级域名设置了cookie。而对于path,一般默认情况下是 / 根目录。

参考资料:cookie设置域名问题,cookie跨域