我遇到了一个问题,如果设置了cookie就试图检索它,如果不是,我想更新它然后检索它。
首先,我有一个设置cookie的函数:
func IndexHandler(w http.ResponseWriter, r *http.Request) {
...
ck := http.Cookie{
Name: "id",
Value: 5,
MaxAge: 60,
}
}
然后在另一个函数中,我检查该cookie是否存在以及是否存在(抛出错误)然后重新创建它
func CheckUpdateCookie(w http.ResponseWriter, r *http.Request) {
val, err := r.Cookie("id")
if err != nil {
ck := http.Cookie{
Name: "id",
Value: 5,
MaxAge: 60,
}
http.SetCookie(w, &ck)
CheckUpdateCookie(w, r)
}
}
这导致它遇到无限循环并且没有意识到已经再次设置了cookie,如果我打印错误我得http: named cookie not present
即使我已经在函数体中设置了cookie。 / p>
答案 0 :(得分:3)
对r.Cookie("id")
的调用会在请求中读取“Cookie”标题。
对http.SetCookie(w, &ck)
的调用会在响应中添加“Set-Cookie”标头。该呼叫不会修改请求。
不是递归地调用函数来获取cookie(由于上述原因而无效),只需使用你手边的cookie:
func CheckUpdateCookie(w http.ResponseWriter, r *http.Request) {
val, err := r.Cookie("id")
if err != nil {
val := &http.Cookie{
Name: "id",
Value: 5,
MaxAge: 60,
}
http.SetCookie(w, val)
}
// val is now set to the cookie.
}
通常将路径设置为“/”,以便cookie可用于所有路径:
val := &http.Cookie{
Name: "id",
Value: 5,
MaxAge: 60,
Path: "/",
}