提起Cookie,你首先想到的是什么? 我想我忘不了那个事件,让我过年都没过好,但也因此刷新了我的cookie的认识。
故事背景
问题
临近过年的时候,提前休了几天假回家,原本在家过得美滋滋的。突然收到一封投诉信,系统的移动端页面无法打开,影响用户使用了。然后联合几个小伙伴一起复现,排查,部分用户能够正常使用,以为这是一个偶发性问题。经过深入的排查,罪魁祸首竟是Cookie。
我们在同一个域下面的两个应用,路径不同,因为项目中有一个服务采用了cookie进行认证,请求接口之前需要先在cookie中设置一个id。所有接口都需要通过cookie中的id认证后才能访问。访问第一个页面后,产生了cookie,然后过一天,访问第二个页面,上一个页面失效的cookie在第二个页面的请求中仍然会带过去。移动端上也不好查看cookie,用移动调试神器Eruda查看Resource面板下,并没有看到上一个页面的cookie。但是通过后台请求日志发现确实是有的。
解决方案
在覆盖cookie的时候需要加上对应的path
document.cookie = "id=123;path=/";
知识回顾
为了避免后续再遇到这种问题,我们来回顾一下cookie的使用
什么是 cookie?
Cookie 是在您的计算机上存储在小的文本文件中的数据。
当 web 服务器向浏览器发送网页后,连接被关闭,服务器会忘记用户的一切。
Cookie 是为了解决“如何记住用户信息”而发明的:
- 当用户访问网页时,他的名字可以存储在 cookie 中。
- 下次用户访问该页面时,cookie 会“记住”他的名字。
通过 JavaScript 创建 cookie
JavaScript 可以用 document.cookie
属性创建、读取、删除 cookie。
通过 JavaScript,可以这样创建 cookie:
document.cookie = "id=123";
覆盖cookie
document.cookie = "id=123;path=/";
如何确定cookie的path,在PC端的cookie面板中可以看到。
删除cookie
通过将cookie的expires设置为过去的时间,可以删除cookie
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
cookie属性
属性 | 描述 |
---|---|
name | cookie的名称 |
value | cookie对应的值 |
expire | 过期时间,在设置的某个时间点后该 Cookie 就会失效 |
path | 该 Cookie 是在当前的哪个路径下生成的 |
domain | 生成该 Cookie 的域名 |
httponly | 设置后,只能通过 HTTP 响应报文的 Set-Cookie 来新增或更新 cookie ,客户端无法通过脚本的方式来读写 cookie。 |
secure | 即请求必须为安全连接(HTTPS),cookie 才会被保存下来。HTTP 协议下,cookie 无效。 |
总结
看似不起眼的问题,有可能在某个时间点被放大,从而造成不良的后果。吃一堑长一智,希望在今后的工作和生活中认真对待细节,并时常整理与回顾知识。
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天