1 回答
TA贡献1772条经验 获得超5个赞
您尝试做的事情并不好,因为 cookie 不能那样工作。
首先是简单的事情:HttpOnly、Domain 和 Secure:这些值不会在 HTTP 客户端请求中传输,这些字段c
将始终为空。客户端使用这些字段来确定是否在Cookie
标头中发送(名称,值)对,但不发送这些值。
对于 HttpOnly、Secure(和 SameSite),这无关紧要,因为这些(以及 MaxAge 和 Expires)对cookie身份没有贡献。
Cookie 身份基于在SetCookie
标头中发送的三元组(域、路径、名称)。通常域和路径是隐含的,但它们确实在客户端上定义了值。
现在要删除具有标识(Domain-X、Path-X、Name-X)的 cookie,您必须发送具有相同标识(Domain-X、Path-X、Name-X)且 MaxAge=-1 的 cookie。但如上所述,您收到的 cookie不包含域和路径。
有两种出路:
您必须知道您的 cookie 是域 cookie 还是主机 cookie,以及它们设置的路径,并使用该信息删除它们。(我会推荐这个。)
删除所有可能的cookie。在请求路径
/foo/bar/wuz
时,来自客户端的 cookie 可能来自 path/
,/foo
或者/foo/bar
(如果我没记错的话;在 RFC 6265 中测试并查找它)。因此,删除所有这些路径的名称为“Name-X”的 cookie。对更复杂的 Domain 属性执行相同的操作。删除主机 cookie (Domain=="") 并删除域 cookie (Domain!="")。确保获得正确的域名(有效 TLD 加一)。
如您所见,2 非常复杂。但这就是 cookie 的设计方式:服务器应该知道服务器设置了哪些 cookie,即服务器应该知道其所有 cookie 的 cookie 身份(域、路径、名称)。客户端的职责是只为某个请求发回适当的 (Name,Value) 对。如果服务器希望删除一个 cookie,它只需将该 cookie 的 MaxAge 设置为 -1。请注意,“那个 cookie”是服务器应该知道的,而不是从客户端请求中推断出来的。
- 1 回答
- 0 关注
- 156 浏览
添加回答
举报