go - 删除所有 cookie
问题描述
我很难使用以下代码删除所有 cookie。似乎发生的事情是域被更改为在其前面附加一个点。我没有删除所有 cookie,而是得到域略有不同的重复 cookie。有什么方法可以完全删除所有 cookie,无论它们的域是什么样的?
谢谢你的帮助!
//DeleteCookies deletes all cookies
func DeleteCookies(w http.ResponseWriter, r *http.Request) {
for _, c := range r.Cookies() {
deleted := &http.Cookie{
Name: c.Name,
Path: c.Path,
//Expires: time.Unix(0, 0),
MaxAge: -10,
HttpOnly: c.HttpOnly,
Domain: c.Domain,
Secure: c.Secure,
Value: "",
}
http.SetCookie(w, deleted)
}
}
解决方案
您尝试做的事情并不好,因为 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”是服务器应该知道的,而不是从客户端请求中推断出来的。
推荐阅读
- algorithm - 将“并行性”引入任务调度问题
- php - Symfony 4 表单 VichImageType 更新自动填充
- python - 如何在 python selenium 中设置 chrome 设置?
- windows - 如何一次在多个 Windows 服务器上运行 bat 脚本?
- syntax - 为什么在模式匹配中使用“ref”而不是星号?
- java - 从 json 动态填充微调器数据
- google-cloud-platform - 为什么我们看到 memorystore 从 700 条记录中提取一条记录需要更多时间?
- c# - 依赖程序集仅在被代码引用时部署
- terraform - Terraform:自动填充模块的变量
- python - 我正在用python编写下面提到的简单代码,但它没有打开