go - Cookie 随机设置
问题描述
我正在尝试设置一个 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。
解决方案
如果没有可重现的示例,“随机”行为很难调试和推理。
有关您的处理程序的一些错误和注释。
如果
COOKIE_EXPIRE
env var 不是整数,您的处理程序会发回错误响应并且不返回。http.Error()
请注意,在将任何内容写入响应(确实写入响应)后,您无法设置其他标头(包括 cookie )。如果
COOKIE_EXPIRE
是整数但为负或0
,则 cookie 过期(expire
变量)将指向过去,并导致 cookie 在浏览器中被删除。如果 cookie 名称无效(
COOKIE_NAME
env var),则 cookie 可能会被静默丢弃(根据 的文档http.SetCookie()
)。由于您设置
Secure
为true
,请注意 cookie 可能已设置在浏览器中,但当向您的服务器发出不安全 (HTTP) 请求时,它不会被包含(发送)。如果执行模板失败(
tmpl.ExecuteTemplate()
),一些响应可能已经提交,所以你不能发送另一个响应(甚至不能http.Error()
)。您要么必须执行指向缓冲区的模板,如果成功,则发送它;或直接将其发送到响应中,但如果失败,则无法在之后进行更正(最好的办法是记录错误以供以后检查)。
推荐阅读
- google-apps-script - 按删除时取消删除 Gmail 电子邮件和/或按删除电子邮件时分类垃圾箱
- sql - 十亿美元的数据类型,有 7 个十进制值
- hibernate - 一定时间后从数据库中删除实体
- linux - 为什么 io_submit(..., nr, ...) 提交的请求可能比 nr 少?
- ionic3 - 使用 ionic 与 AWS Cognito Federated Identity 和 AWS amplify 登录后刷新 facebook 访问令牌
- xodus - 缓存强制停止,缓存适配器在 Xodus 数据库中过时错误
- php - 根据数组在数据库表中添加行
- java - 如何将图像从 BufferStrategy 绘制到 Png 文件?
- javascript - 单击以在具有多个位置的多个 hml 文件上显示电话号码
- android - 垂直多线芯片组是否有可能每条线有一个芯片?