问题:第一次set cookie可以生效,第二次覆盖或者清除cookie却不生效。查看浏览器的cookie信息,仍然是第一次的值。
cookie := http.Cookie{
Name: name,
Value: value,
HttpOnly: true,
Secure: false,
Path: "/",
}
http.SetCookie(resp, &cookie)
原因:在第二次设置cookie,即清除cookie时,没有设置Path
cookie := http.Cookie{
Name: name,
MaxAge: -1,
Expires: time.Unix(1, 0),
}
http.SetCookie(resp, &cookie)
解决方案:
在清除Cookie时,添加Path,并且与第一次设置时的Path值一致。
用GO语言(golang)写了一个简单的Web服务,但是始终无法获取Cookie的值现象如下:
使用Chrome的开发者工具观察Cookie可以看到设置的Cookie的值
使用r.Cookie(CookieName)无法取得Cookie内容,错误信息:http: named cookie not present
在服务器端打印Requset结构,结果中没有设置的Cookie值
最后Google了一下,在golang-nuts的论坛里找到了解决方法。
根本原因在于GO语言(golang)不能获取值中带有空格的Cookie
而且会将Cookie中的一些特殊字符替换为空格
//src/pkg/net/http.go
func (c *Cookie) String() string {
...
fmt.Fprintf(&b, "%s=%s", sanitizeName(c.Name), sanitizeValue(c.Value))
...
}
...
var cookieValueSanitizer = strings.NewReplacer("\n", " ", "\r", " ", "", " ")
...
func sanitizeValue(v string) string {
return cookieValueSanitizer.Replace(v)
}
俺就是使用了分号。。。
另外讨论中提到的不要使用指针传递http.ResponseWriter的问题,
我试了一下,使用指针传递http.ResponseWriter不会对Cookie的设置和取得产生影响
不过很多函数需要的都是http.ResponseWriter的对象,如果传指针,很多地方要写*http.ResponseWriter着实也挺麻烦
网页cookie查询方法如下:
1、打开浏览器,可以使用电脑自带的浏览器合下载的其它浏览器。
2、打开浏览器之后,在出现的网页里点击键盘中的f12键。
3、点击f12键之后,会弹出一个控制台。
4、在控制台的中,找到上面的网络Internet选项并点击它。
5、点击网络后会弹出内容类型的下拉列表,在这个下拉列表中找到文档,并将文档的前面空格勾选起来。
6、点击内容类型中的文档之后,刷新页面,再点击任意详细的文档信息记录,我们就可以看到右侧显示网页的cookies了。