我很难用下面的代码删除所有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)
}
}
发布于 2020-09-09 05:20:49
你想要做的事情不能很好的发挥作用,因为cookies不是这样工作的。
首先简单的事情是: HttpOnly、Domain :这些值是而不是在HTTP请求中传输的,这些c
字段将始终是空的。客户端使用这些字段来确定是否在Cookie
头中发送(名称,值)Cookie
,但不发送这些值。
对于HttpOnly来说,安全(和SameSite)并不重要,因为这些(和MaxAge以及过期的)做而不是贡献给cookie标识。
Cookie标识基于在SetCookie
头中发送的三重(域、路径、名称)。域和路径通常是隐式的,但它们确实在客户端上定义了值。
现在,要删除带有标识的cookie (Domain-X、Path-X、Name-X),您必须发送具有相同标识的cookie (Domain-X、Path-X、Name-X)和MaxAge=-1。但是如上所述,您收到的cookie不包含域和路径。
有两条出路:
/foo/bar/wuz
时,来自客户端的cookie可能来自path /
、/foo
或/foo/bar
(如果我没有记错,请在RFC 6265中进行测试和查找)。因此,删除所有这些路径的名称为" name -X“的cookie。对于域属性也是这样做的,遗憾的是,这个属性更复杂。删除主机cookie (Domain=="")并删除域cookie(域!=“”)。确保获得正确的域名(有效的TLD +1).如你所见,2是相当复杂的。但是cookie就是这样设计的:服务器应该知道服务器设置了哪些cookie,即服务器应该知道所有cookie的cookie标识(域、路径、名称)。客户端的职责是只为某个请求发送适当的(名称、值)对。如果服务器希望删除cookie,它只是将该cookie的MaxAge设置为-1。请注意,“那个cookie”是服务器应该知道的,而不是从客户端请求中推断出来的。
https://stackoverflow.com/questions/63803734
复制相似问题