登录
首页 >  Golang >  Go问答

Cookie 随机生成

来源:stackoverflow

时间:2024-03-22 23:09:36 429浏览 收藏

本篇文章探讨了在设置 Cookie 时遇到的随机成功与失败问题。该问题在 Chrome、Firefox、Brave 和 Safari 等浏览器上出现,且仅限于 HTTPS 协议。作者建议检查 COOKIE_EXPIRE 环境变量,确保其为正整数,否则 Cookie 过期时间可能指向过去,导致浏览器删除 Cookie。此外,无效的 Cookie 名称可能会导致 Cookie 被丢弃,而 Secure 设置为 true 可能会阻止 Cookie 在 HTTP 请求中被包含。

问题内容

我正在尝试设置 cookie,有时有效,有时无效。没有明显的模式。

func quoteGetHandler(w http.ResponseWriter, req *http.Request) {
    parts := strings.Split(req.URL.Path, "/")
    csrfToken := uniuri.NewLen(32)
    exp, err := strconv.Atoi(os.Getenv("COOKIE_EXPIRE"))  //5
    if err != nil {
        http.Error(w, whereami.WhereAmI()+err.Error(), http.StatusInternalServerError)
    }
    expire := time.Now().Add(time.Duration(exp) * time.Minute)
    cookie := http.Cookie{
        Name:     os.Getenv("COOKIE_NAME"), //csrf_token
        Value:    csrfToken, //string
        Path:     "/",
        Expires:  expire,
        HttpOnly: true,
        Secure:   true,
        MaxAge:   0,
        Domain:   os.Getenv("DOMAIN")} //<--example.com
    http.SetCookie(w, &cookie)
    tmp := htmlTags["quote"]
    tmp.CsrfToken = csrfToken
    if 2 < len(parts) && parts[2] != "" {
        tmp.Param = parts[2]
    }
    htmlTags["quote"] = tmp
    err = tmpl.ExecuteTemplate(w, siteType+"quote", htmlTags["quote"])
    if err != nil {
        http.Error(w, whereami.WhereAmI()+err.Error(), http.StatusInternalServerError)
    }
}

这种情况发生在 chrome、ff、bravo、safari 上。

协议是https。


正确答案


如果没有可重现的示例,“随机”行为很难调试和推理。

有关您的处理程序的一些错误和注释。

  1. 如果 COOKIE_EXPIRE 环境变量不是整数,您的处理程序会发回错误响应并且不会返回。请注意,在向响应写入任何内容后,您无法设置其他标头(包括 cookie)(http.Error() 确实写入了响应)。

  2. 如果 COOKIE_EXPIRE 是整数但为负数或 0,则 Cookie 过期时间(expire 变量)将指向过去,并导致 Cookie 在浏览器中被删除。

  3. 如果 cookie 名称无效(COOKIE_NAME env var),则 cookie 可能会被默默丢弃(根据 http.SetCookie() 的文档)。

  4. 由于您将 Secure 设置为 true,请注意,可能会在浏览器中设置 Cookie,但当向您的服务器发出不安全 (HTTP) 请求时,它不会被包含(发送)。

  5. 如果执行模板失败 (tmpl.ExecuteTemplate()),则某些响应可能已提交,因此您无法发送另一个响应(甚至不能发送 http.Error())。您要么必须执行定向到缓冲区的模板,如果成功,则发送它;或者直接将其发送到响应中,但如果失败,您之后无法进行更正(您能做的最好的事情就是记录错误以供以后检查)。

终于介绍完啦!小伙伴们,这篇关于《Cookie 随机生成》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>