GetCookie 返回空通常因Path不匹配、Secure Cookie在HTTP下不发送或Domain配置错误;SetCookieKV需注意MaxAge、Path和Domain设置;加密用CookieEncode/Decode;Session与Cookie混用时需同步过期逻辑。

GetCookie 读取 Cookie 时为什么总是空?
常见现象是 ctx.GetCookie("token") 返回空字符串,即使浏览器 DevTools 的 Application → Cookies 里明确看到该 key 存在。
原因通常有三个:
- Cookie 的
Path设置为/admin,但当前请求路径是/api/user,不匹配就无法读取 - 服务端设置了
HttpOnly=true(Iris 默认开启),此时 JavaScript 无法访问,但 Go 后端仍可读 —— 这不是问题,只是常被误判为“读不到” - Cookie 带了
Secure=true,但你正用http://localhost:8080测试,而 Secure Cookie 只会在 HTTPS 下发送,导致请求头里根本没带它
验证方法:打印原始请求头:ctx.Request().Header.Get("Cookie"),如果返回空,说明浏览器压根没发过来,优先查 Path / Secure / Domain 配置。
SetCookieKV 设置后前端收不到?
ctx.SetCookieKV("theme", "dark") 看似简单,但默认行为容易踩坑:
- 它自动设置
MaxAge=31536000(即 365 天),如果你只想做会话级 Cookie,得显式覆盖:ctx.SetCookieKV("theme", "dark", iris.CookieExpires(0)) - 未指定
Path时,Iris 默认设为"/";但如果前端请求路径是/dashboard/setting,而你设了Path: "/dashboard",那只有该路径下能读到 - 跨子域共享需手动设
Domain,比如从app.example.com写入、api.example.com读取,必须设iris.CookieDomain(".example.com")(注意开头的点)
示例(安全会话 Cookie):
ctx.SetCookieKV("session_id", "abc123",
iris.CookieHTTPOnly(true),
iris.CookieSecure(true), // 仅 HTTPS
iris.CookieSameSite(http.SameSiteLaxMode),
iris.CookiePath("/"),
)
需要加密存储 Cookie 怎么办?
Iris 提供了 CookieEncode 和 CookieDecode 选项,不是简单 base64,而是支持自定义加解密逻辑。
典型场景:把用户 ID 存进 Cookie,但不想明文暴露。你可以用 AES 加密:
- 注册编码器时传入密钥和 IV,确保加解密一致
-
CookieEncoder函数签名是func(string, interface{}) (string, error),第二个参数是 value 的指针,别直接传值 - 解码失败时,
GetCookie会静默返回空字符串,不会 panic —— 所以建议搭配日志或 fallback 逻辑
简写示例(使用内置的简单混淆,非生产推荐):
encoder := func(name string, value interface{}) (string, error) {
s, ok := value.(string)
if !ok {
return "", errors.New("value not string")
}
return base64.StdEncoding.EncodeToString([]byte(s + ":salt")), nil
}
ctx.SetCookieKV("user", "1001", iris.CookieEncode(encoder))
// 对应的 decoder 需逆向处理
Cookie 和 Session 混用时要注意什么?
很多人用 SetCookieKV 存 session ID,再用 sessions.Start(ctx) 读,这没问题,但关键点在于生命周期管理:
- Iris 的 session 默认依赖 Cookie 存储 ID,它的过期时间由
sessions.Config.Expire控制,和 Cookie 自身的MaxAge是两套逻辑 —— 如果后者先过期,session 就断连了 - 调用
session.Destroy()会清除服务端数据,但不会自动删客户端 Cookie;得额外调用ctx.RemoveCookie("session_id")或ctx.SetCookieKV("session_id", "", iris.CookieExpires(-1)) - 若同时用 JWT 和 Cookie 存 session ID,务必确认中间件顺序:鉴权中间件必须在 session 中间件之后,否则
session.ID()拿不到值
最易忽略的一点:开发时改 Cookie 名称或路径后,旧 Cookie 不会自动覆盖,浏览器会并存新旧两个,导致行为混乱。清空浏览器 Cookie 或用 Incognito 模式验证更可靠。


















