对于我的身份验证过程,我在用户登录时创建一个唯一令牌,并将其放入用于身份验证的cookie中.
所以我会从服务器发送这样的东西:
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/;
Run Code Online (Sandbox Code Playgroud)
哪个适用于所有浏览器.然后删除一个cookie我发送一个类似的cookie,其expires字段设置为1970年1月1日
Set-Cookie: token=$2a$12$T94df7ArHkpkX7RGYndcq.fKU.oRlkVLOkCBNrMilaSWnTcWtCfJC; path=/; expires=Thu, Jan 01 1970 00:00:00 UTC;
Run Code Online (Sandbox Code Playgroud)
这在Firefox上工作正常,但不会删除IE或Safari上的cookie.
那么删除cookie的最佳方法是什么(最好不使用JavaScript)?过去设定的过期方法看起来很笨重.还有为什么这在FF中工作但在IE或Safari中不起作用?
Lek*_*eyn 193
使用; expires附加发送相同的cookie值不会破坏cookie.
通过设置空值来使cookie无效并包含一个expires字段:
Set-Cookie: token=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT
Run Code Online (Sandbox Code Playgroud)
请注意,您无法强制所有浏览器删除Cookie.客户端可以配置浏览器,使cookie保持不变,即使它已过期.如上所述设置值将解决该问题.
Mar*_*ery 15
在我撰写此答案时,此问题的可接受答案似乎表明,当接收到Expires值为过去的替换cookie时,浏览器不需要删除cookie 。该说法是错误的。设置Expires为过去是删除Cookie的标准且符合规范的方式,规范要求用户代理遵守该规范。
Expires过去使用属性删除Cookie是正确的,并且是删除规范规定的Cookie的方法。RFC 6255的示例部分指出:
最后,要删除cookie,服务器将返回一个Set-Cookie标头,其中包含过去的到期日期。仅当Set-Cookie标头中的Path和Domain属性与创建cookie时使用的值匹配时,服务器才能成功删除cookie。
“ 用户代理要求”部分包括以下要求,如果用户代理收到的同名新Cookie的过期日期过去,则必须立即删除该Cookie。
如果[当接收到一个新的cookie时] cookie存储区包含一个具有与新创建的cookie相同的名称,域和路径的cookie:
- ...
- ...
- 更新新创建的cookie的创建时间以匹配旧cookie的创建时间。
- 从cookie存储区中删除旧cookie。
将新创建的cookie插入cookie存储。
如果cookie具有过去的过期日期,则cookie被“过期”。
如果任何时候在cookie存储中存在过期的cookie,则用户代理必须从cookie存储中逐出所有过期的cookie。
上面的点11-3、11-4和12一起表示,当接收到具有相同名称,域和路径的新cookie时,必须删除旧cookie并用新cookie替换。最后,关于过期cookie的以下几点进一步表明,完成此操作后,还必须立即将新 cookie 逐出。在这一点上,规范没有为浏览器提供任何回旋余地。如果浏览器向用户提供禁用cookie过期的选项,如公认的答案表明某些浏览器会这样做,则将违反规范。(这种功能也几乎没有用,据我所知它在任何浏览器中都不存在。)
那么,为什么这个问题的OP观察到这种方法失败了?尽管我没有清除Internet Explorer的副本来检查其行为,但我怀疑这是因为OP的Expires值格式不正确!他们使用了这个值:
expires=Thu, Jan 01 1970 00:00:00 UTC;
Run Code Online (Sandbox Code Playgroud)
但是,从两种角度来看,这在语法上是无效的。
规范的语法部分规定该Expires属性的值必须为
rfc1123 -date,在[RFC2616]第3.3.1节中定义
在上面的第二个链接之后,我们发现它是以下格式的示例:
Sun, 06 Nov 1994 08:49:37 GMT
Run Code Online (Sandbox Code Playgroud)
并找到语法定义...
要求日期以年月年格式书写,而不是问题提问者使用的月日年格式。
具体来说,它定义rfc1123-date如下:
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
Run Code Online (Sandbox Code Playgroud)
并定义date1如下:
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
Run Code Online (Sandbox Code Playgroud)和
不允许UTC作为时区。
规范包含以下有关此格式可接受的时区偏移的声明:
所有HTTP日期/时间戳都必须毫无例外地以格林威治标准时间(GMT)表示。
更重要的是,如果我们深入研究此日期时间格式的原始规范,则会发现它在https://tools.ietf.org/html/rfc822的初始规范中,“ 语法”部分列出了“ UT”(表示“通用时间” )作为一个可能的值,但确实不是列表不UTC(世界协调时间)为有效。据我所知,以这种日期格式使用“ UTC” 从未有效。这不是一个有效的值时,在1982年第一次指定的格式,和HTTP规范已经通过严格更通过禁止使用除“GMT”以外的所有“区”值的格式的限制版本。
如果这里的问题提问者已经代替了Expires属性,像这样的话:
expires=Thu, 01 Jan 1970 00:00:00 GMT;
Run Code Online (Sandbox Code Playgroud)
那么大概就可以了。
小智 11
使用 Max-Age=-1 而不是“Expires”。它更短,对语法不那么挑剔,无论如何 Max-Age 优先于 Expires。
| 归档时间: |
|
| 查看次数: |
125173 次 |
| 最近记录: |