iris 中必须使用框架封装的 cookie 接口(如 setcookiekv、getcookie、removecookie)而非 http.setcookie,否则 context.getcookie 无法读取且 cookiehttponly 等选项失效;setcookiekv 默认有效期为 365 天;临时 cookie 需显式传入过期时间;多选项可叠加;cookiesecure 在非 https 下无效;编码/解码逻辑须对称;removecookie 实为设置 max-age=0;跨子域需显式设 cookiedomain(".example.com")。

在 Iris 中设置 Cookie 不是调用 http.SetCookie 那么简单,必须走框架封装的接口,否则 Context.GetCookie 无法读取、CookieHTTPOnly 等选项也不会生效。
SetCookieKV 默认有效期是 365 天
直接用 ctx.SetCookieKV("theme", "dark") 设置的 Cookie,浏览器会默认存一年。这不是 bug,是 Iris 的硬编码行为 —— 源码里写死了 365 * 24 * time.Hour。
如果你只是临时存个登录态或 CSRF token,必须显式传入过期时间:
ctx.SetCookieKV("token", "abc123", iris.CookieExpires(15*time.Minute))ctx.SetCookieKV("lang", "zh-CN", iris.CookiePath("/api"))- 多个选项可叠加:
iris.CookieHTTPOnly(true), iris.CookieSecure(true), iris.CookieSameSite(http.SameSiteLaxMode)
注意:CookieSecure 在非 HTTPS 环境下不会生效(浏览器拒绝写入),本地开发时建议配合 iris.CookieHTTPOnly(false) 方便调试。
GetCookie 读不到刚 Set 的值?检查编码/解码链路
如果用了 iris.CookieEncode 或自定义 CookieEncoder,但 ctx.GetCookie("name") 返回空或乱码,大概率是编码/解码不匹配。
常见错误现象:
- 写入时用了
iris.CookieEncode(base64Encoder),读取时没配iris.CookieDecode(base64Decoder) - 解码函数返回了错误,但没检查
err,导致GetCookie静默失败并返回空字符串 - 编码器把
value interface{}当成结构体序列化,但解码器试图用string接收
正确做法:编码和解码逻辑必须对称,且解码函数第二个参数(编码后的字符串)要能被原样还原。测试时先用 fmt.Printf 打印出原始 cookie 值,确认是否被篡改。
RemoveCookie 实际是 Set 一个过期的 Cookie
Iris 没有真正“删除” Cookie 的 HTTP 操作,ctx.RemoveCookie("session_id") 底层只是调用 SetCookie 写入一个 Max-Age=0 + Expires=PastTime 的响应头。
所以要注意:
- 路径(
Path)必须和当初SetCookie时完全一致,否则浏览器不会清除对应 cookie - 如果原 cookie 是
CookiePath("/admin"),清除时也得写ctx.RemoveCookie("session_id", iris.CookiePath("/admin")) -
CookieHTTPOnly和CookieSecure也要保持一致,否则某些浏览器(如 Safari)可能拒绝覆盖
最稳妥的方式是:清除前先 ctx.GetCookie 确认存在,再用完全相同的 path/domain/secure 属性调用 RemoveCookie。
跨子域名共享 Cookie 要手动设 Domain
默认情况下,Iris 设置的 Cookie 只作用于当前 hostname(比如 localhost 或 api.example.com),无法被 app.example.com 读取。
要实现跨子域共享,必须显式指定 Domain:
ctx.SetCookieKV("user_id", "123", iris.CookieDomain(".example.com"))- 注意开头的点号
.,这是标准写法,表示匹配所有子域 - 不能写成
example.com(无点号),否则现代浏览器会拒绝设置
这个配置容易被忽略,尤其在前后端分离部署(前端 web.example.com,后端 api.example.com)时,会导致登录态无法透传。











