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
相关产品推荐
相关产品推荐

