项目中遇到这样一个问题:用户登录后,跳转到该域名下的其他页面时,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.com
、tool.child.a.test.com
等都是能够访问到该cookie的。而b.test.com
是无法访问到的。
如果设置domain为test.com
,则a.test.com
以及test.com
下的所有子域名都能访问下,这意味着它的同级域名b.test.com
也能够访问到。有什么用呢?
这样可以用来解决sso单点登录或者跨域cookie等问题。当然,现在的单点登录一般是通过返回的ticket
凭证到服务端做校验去获取信息。
比如,对于a.test.com
和b.test.com
两个项目,公用user.test.com
用户系统做单点登录,可以通过设置domain为test.com
,在user退出的时候清除根域名下的cookie以达到协同退出的功能。
回到上面的问题:所以在当前域名无法清除cookie的时候,只可能是它的上级域名设置了cookie。而对于path,一般默认情况下是 /
根目录。