SetCookie和GetCookie在Iris中易出错:SetCookie因未结束响应、Path过窄、Domain缺失或Secure误用导致浏览器不接收;SetCookieKV默认365天有效期且HttpOnly/SameSite=Lax,灵活性低于SetCookie;GetCookie解码失败多因编解码器不匹配、指针传参错误或cookie被截断;HttpOnly默认true、SameSite默认Lax,跨域等场景需显式配置。

SetCookie 和 GetCookie 是 Iris 中最直接的 Cookie 操作入口,但实际用错的人不少——不是值没存上,就是取出来是空,或者过期时间不对、路径不匹配、HttpOnly 被意外关闭。下面按真实开发中高频出问题的点拆解。
SetCookie 时为什么浏览器收不到?
常见现象:调用 ctx.SetCookie 后,浏览器 DevTools 的 Application → Cookies 里看不到,或 GetCookie 返回空字符串。
- 没调用
ctx.Next()或没结束响应(比如忘了ctx.WriteString等),导致响应未真正发出 -
Path设置太窄,比如设成/admin,但请求 URL 是/,浏览器就不会携带该 cookie - 没设
Domain却在跨子域场景下使用(如从api.example.com写 cookie 到example.com),需显式指定iris.CookieDomain(".example.com") - 开发环境用
http://localhost:8080,却启用了Secure选项,浏览器拒绝保存(iris.CookieSecure(true)只应在 HTTPS 下启用)
SetCookieKV 和 SetCookie 的关键区别
SetCookieKV 看起来更简洁,但它有隐含行为,容易踩坑:
-
SetCookieKV("theme", "dark")默认有效期是 365 天,而SetCookie默认不设Expires(即 session cookie,关浏览器就丢) -
SetCookieKV默认开启HttpOnly和SameSite=Lax,但如果你需要 JS 读取(比如前端做主题切换),得手动关:iris.CookieHTTPOnly(false) - 它不接受
*http.Cookie结构体,没法精细控制MaxAge或SameSite枚举值(比如要SameSite=Strict,只能用SetCookie配http.SameSiteStrictMode)
GetCookie 解码失败的典型原因
你设置了编码(比如用 iris.CookieEncode 加密 cookie 值),但 GetCookie 返回空或 panic,大概率是解码环节断了:
- 编码器和解码器不配对:比如用
base64编码,却用json.Unmarshal解码 - 解码器函数第三个参数是值指针,写成值类型会 panic:
func(name, value string, ptr interface{}) error,传&v,不是v - cookie 值被前端篡改或截断(比如超长被浏览器静默截断),解码时返回 error,
GetCookie默认静默忽略并返回空字符串——你需要用GetCookieWithErr捕获错误
HttpOnly 和 SameSite 的默认行为必须确认
Iris 的 cookie 默认安全策略比原生 net/http 更激进,这点常被忽略:
-
HttpOnly默认为true,意味着 JS 无法通过document.cookie读取——这是好事,但如果你在登录后用 JS 读 token 做无感刷新,就得关掉它 -
SameSite默认是Lax,在 POST 表单跨站提交时会丢 cookie;若你的前端是纯静态站点(如 Vue SPA 部署在fe.example.com,API 在api.example.com),得设iris.CookieSameSite(http.SameSiteNoneMode)并配套开Secure - 修改这些默认值不能只靠全局变量(如
iris.Context.SetCookieKVExpiration只影响SetCookieKV),每个SetCookie调用都得显式传 option
Iris 的 cookie 接口看似简单,但每个 option 都可能在特定部署环境下触发连锁反应——尤其是跨域、HTTPS、子域共享、前端直读这几个交叉场景,建议每次设置前先用 curl -v 或浏览器 Network → Headers 确认 Set-Cookie 响应头是否符合预期。











