Golang Gin框架createCookie首次调用返回NotSet问题咨询
问题成因
- Cookie 是客户端(浏览器)侧存储的标识,仅会在客户端发起请求时主动携带到请求头中,服务端才能从当前请求中读取到对应值。
- 你的代码逻辑为先读当前请求的Cookie,读不到才往响应头写入Set-Cookie指令:首次请求时客户端还没有存储device的Cookie,自然读不到值返回NotSet;你写入的Set-Cookie指令需要等客户端接收到响应后才会存储到本地,第二次请求时客户端才会携带这个Cookie,服务端才能读到值,这是HTTP协议的固有逻辑,不是框架bug。
- 额外注意你当前配置的
SetCookie参数可能触发浏览器拦截:你把secure参数设为了true,只有HTTPS协议下Cookie才会被正常存储;同时如果os.Getenv("AUTH_DOMAIN")和你当前访问的域名不匹配,浏览器也会拒收Cookie,导致永远读不到值。
解决办法
如果你的需求是该函数无论首次调用还是后续调用都能返回有效值,调整赋值逻辑即可:检测不到Cookie时直接将返回值设为你要写入的Cookie值,不需要等下次请求携带:
// createCookie accepts c as gin context and create cookies func createCookie(c *gin.Context) (string, error) { cookie, err := c.Cookie("device") if err != nil { // 直接赋值为要设置的cookie值,替换原有NotSet逻辑 cookie = "test" // 本地HTTP开发调试时可临时把secure参数改为false,避免Cookie被拦截 c.SetCookie("device", cookie, 3600, "/", os.Getenv("AUTH_DOMAIN"), true, true) } return cookie, nil }
如果你的业务逻辑需要确认客户端确实存储了Cookie再返回对应值,只能拆成两次接口调用:首次接口仅负责下发Set-Cookie,第二次接口再读取Cookie做业务判断。
内容的提问来源于stack exchange,提问作者Mandeep Gill
相关产品推荐
相关产品推荐

