You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang web服务调用http.SetCookie无法写入Cookie问题求助

问题原因

  • 第一,Cookie设置顺序错误
    HTTP响应的Header必须在写入状态码、响应体之前设置完成。你当前的代码先调用了w.WriteHeader(http.StatusCreated),之后才执行http.SetCookie设置Cookie,此时响应头已经被发送给客户端,后续设置的Cookie无法被写入响应头,自然不会生效。
    对比你可以正常运行的注册逻辑代码,是先设置Cookie再调用http.Redirect(http.Redirect方法内部会自动处理状态码写入,符合Header先设置的要求),所以可以正常写入Cookie。
  • 第二,Cookie值硬编码错误
    你设置Cookie时给Value赋值的是带引号的字符串"user.Email"和"code",不是对应变量的值,哪怕顺序改对了,存的也只是固定字符串,不是你预期的用户邮箱和验证码,需要去掉引号,改为直接引用变量:
cookie := http.Cookie{Name: "email", Value: user.Email, Path: "/"}
cookie2 := http.Cookie{Name: "VerificationCode", Value: code, Path: "/"}
  • 补充:如果你的请求是前端跨域发送的AJAX请求,还需要确保请求时开启了withCredentials配置,同时服务端设置了对应的CORS头部允许携带凭证,否则浏览器会自动拦截响应中的Set-Cookie头部,也会导致Cookie不生效。

修复方案

调整代码顺序,把w.WriteHeader(http.StatusCreated)和w.Header().Set("Content-Type", "application/json")移到设置Cookie的逻辑之后即可,修改后的核心逻辑如下:

log.Print("verification code sent, check your email")

// 先设置Cookie
cookie := http.Cookie{Name: "email", Value: user.Email, Path: "/"}
http.SetCookie(w, &cookie)
cookie2 := http.Cookie{Name: "VerificationCode", Value: code, Path: "/"}
http.SetCookie(w, &cookie2)

// 再设置其他Header、写入状态码
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)

// 最后写响应体
resp["VerificationCode"] = code
jsonResp, err := json.Marshal(resp)
if err != nil {
    log.Fatalf("Error happened in JSON marshal. Err: %s", err)
}
w.Write(jsonResp)

内容的提问来源于stack exchange,提问作者Hasan A Yousef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:45:00