为了账号安全,请及时绑定邮箱和手机立即绑定

命名 cookie 不存在

命名 cookie 不存在

Go
海绵宝宝撒 2022-10-10 19:24:29
我正在建立一个网站,该网站将依赖 cookie 来处理各种事情。然后我决定有一个设置cookie然后读取相同cookie的功能,以查看浏览器是否允许cookie。但这失败了。./views/index.html 中的模板{{define "index"}}template{{end}}主要代码:package mainimport (    "fmt"    "html/template"    "log"    "net/http"    "strconv"    "time"    "github.com/gorilla/handlers"    "github.com/gorilla/mux")var tmpl *template.Templatefunc main(){    port :=":8088"    router := mux.NewRouter()    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {        //Set test cookie        cookieName := strconv.FormatInt(time.Now().UnixNano(), 10)        cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)        fmt.Println("cookieName:" + cookieName)        fmt.Println("cookieValue:" + cookieValue)        cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}        http.SetCookie(w, &cookie)        //Get cookies        fmt.Println("Range over cookies")        for _, c := range r.Cookies() {            fmt.Println(c)        }        //Get test cookie by name        c, err := r.Cookie(cookieName)        if err != nil {            fmt.Println("Error: " + err.Error())        } else {            fmt.Println(c.Value)        }        err = tmpl.ExecuteTemplate(w, "index", "")        if err != nil {            http.Error(w, err.Error(), http.StatusInternalServerError)        }    })    var err error    tmpl, err = template.ParseGlob("views/*")    if err != nil {        panic(err.Error())    }    router.PathPrefix("/").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {        http.FileServer(http.Dir("./static/")).ServeHTTP(res, req)    })    fmt.Println("Server running on localhost" + port)    err = http.ListenAndServe(port, handlers.CompressHandler(router))    if err != nil {        log.Fatal(err)    }}这是终端输出:Server running on localhost:8088cookieName:1636243636497412077cookieValue:1636243636497413613Range over cookiesError: http: named cookie not present任何指向我的问题可能是什么?
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

在将 cookie 发送到客户端之前,您正在检查 r.Cookies。您必须发送 cookie,然后如果您想检查他们的 cookie,请发送第二个请求。在您发送第一个响应后,打开浏览器并查看您的 cookie 是否存在会容易得多。



查看完整回答
反对 回复 2022-10-10
?
Qyouu

TA贡献1786条经验 获得超11个赞

Request.Cookie方法从请求 Cookie标头中获取 cookie 。

函数http.SetCookie将 Set-Cookie 标头添加到响应标头中。您可以使用以下代码观察 http.SetCookie 的结果:

 fmt.Println(w.Header()["Set-Cookie"])

当前请求中不存在命名的 cookie,因为 http.SetCookie 不会修改当前请求。

cookie 值的流程是这样的:

  1. 服务器使用 Set-Cookie 标头在响应中设置 cookie。

  2. 客户端将 cookie 存储在“cookie jar”中。

  3. 客户端使用 Cookie 请求标头将 jar 中的匹配 cookie 添加到请求中。

  4. 服务器从请求标头中获取 cookie。

试试这个代码。在浏览器中加载页面并刷新以观察 cookie 值的流动。

 const cookieName = "example"

    cookieValue := strconv.FormatInt(time.Now().UnixNano(), 10)

    fmt.Printf("Set cookie %s=%s\n", cookieName, cookieValue)


    cookie := http.Cookie{Name: cookieName, Value: cookieValue, Path: "/"}

    http.SetCookie(w, &cookie)


    c, err := r.Cookie(cookieName)

    if err != nil {

        fmt.Printf("Get cookie %s error: %v\n", cookieName, err)

    } else {

        fmt.Printf("Get cookie %s=%s\n", cookieName, c.Value)

    }


查看完整回答
反对 回复 2022-10-10
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信