【问题标题】:Cookie sets randomly [closed]Cookie随机设置[关闭]
【发布时间】:2021-08-25 19:28:22
【问题描述】:

我正在尝试设置一个 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。

【问题讨论】:

  • 与您的问题无关,但为什么您要为每个请求重新解析环境变量,而不是一次?
  • “有时有效,有时无效” - 什么是“有效”,什么是“无效”。您甚至观察到什么 - HTTP 响应、应用程序行为....?这种不稳定的行为与环境变量相同吗?
  • 有时它会按预期设置 cookie。然后它不设置cookie。这种行为非常随机。

标签: go cookies setcookie


【解决方案1】:

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

关于您的处理程序的一些错误和注意事项。

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

  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())。您要么必须执行指向缓冲区的模板,如果成功,则发送它;或直接将其发送到响应,但如果失败,则无法在之后进行更正(最好的办法是记录错误以供以后检查)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2020-06-27
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多