iris.Context.Cookies()直接读取所有Cookie,返回map[string]string;推荐用ctx.GetCookie()安全获取单个Cookie,且ctx必须为方法第一个参数,SetCookie需在响应写出前调用。

iris.Context.Cookies() 直接读取所有 Cookie
在 Iris MVC 控制器方法中,iris.Context 已自动注入,无需手动传参或绑定。直接调用 ctx.Cookies() 可获取当前请求携带的所有 Cookie 键值对(map[string]string 类型)。
常见错误是试图用 http.Request.Header.Get("Cookie") 手动解析 —— 这不仅绕过 Iris 的封装逻辑,还容易漏掉 Secure/HttpOnly 标志、路径匹配等语义,且无法与 ctx.SetCookie() 等配套方法协同工作。
-
ctx.Cookies()返回的是解码后、URL-safe 的原始值(如%20→ 空格),无需再调用url.QueryUnescape - 若只读单个 Cookie,推荐用
ctx.GetCookie("session_id"),它内部做了空值和错误处理,比ctx.Cookies()["session_id"]更安全 - 注意:Cookie 名区分大小写,
ctx.GetCookie("Session_ID")和ctx.GetCookie("session_id")是两个不同键
控制器方法签名里加 ctx iris.Context 参数也能用
虽然 Iris 支持无参方法(如 func (c *MyController) Get() string),但一旦需要读 Cookie、Header 或写响应,就必须显式声明 ctx iris.Context 作为第一个参数。
这是因为 Iris 的参数绑定机制只对前几个固定类型(iris.Context、int64、string 等)做自动注入;其余自定义结构体需手动从 ctx 提取。
- 正确写法:
func (c *MyController) Get(ctx iris.Context) string - 错误写法:
func (c *MyController) Get(id int, ctx iris.Context) string——ctx必须是第一个参数,否则注入失败,运行时ctx为 nil - 如果还要读 URL 路径参数(如
/user/{id:int}),顺序应为:func (c *MyController) Get(ctx iris.Context, id int) string
SetCookie / DeleteCookie 必须在响应写出前调用
在控制器中设置或删除 Cookie,要用 ctx.SetCookie() 或 ctx.RemoveCookie(),而不是操作 http.ResponseWriter.Header()。
关键限制是:这些方法必须在 ctx.WriteString()、ctx.JSON() 等任何响应写出调用之前执行。Iris 的 Context 在首次写响应时会冻结 Header,之后再调用 SetCookie 就静默失效 —— 不报错,但浏览器收不到 Set-Cookie 头。
-
ctx.SetCookie(&http.Cookie{Name: "theme", Value: "dark", Path: "/", MaxAge: 3600})是标准用法 - 想删 Cookie,别只设空值:
ctx.RemoveCookie("token")会自动发送过期时间戳,比SetCookie(..., MaxAge: -1)更可靠 - 若控制器返回
string或struct{},Iris 会在方法返回后自动调用ctx.Text()或ctx.JSON(),所以SetCookie必须放在 return 前
Cookie 加密和签名依赖 app.Use(iris.Compression) 吗?不,靠 app.AddSecret
很多人误以为 Cookie 安全靠中间件控制,其实 Iris 的加密 Cookie(ctx.SetCookieKV + 自动签名)由 app.AddSecret() 决定,跟是否启用压缩、日志或 CORS 中间件完全无关。
如果你用 ctx.SetCookieKV("auth", "xxx") 期望得到签名 Cookie,但浏览器收到的仍是明文,大概率是漏了这句:
app := iris.New()
app.AddSecret([]byte("your-32-byte-secret-here")) // 必须在 app.Run() 前调用
- Secret 长度建议 32 字节(AES-256),太短会被 Iris 拒绝并 panic
-
SetCookieKV和GetCookie会自动加签/验签;而SetCookie始终明文,适合存 theme、lang 等非敏感数据 - 开发时可用
iris.DevMode关闭签名校验方便调试,但上线前务必移除
Iris 对 Cookie 的封装很薄,没抽象层遮挡细节。真正容易出问题的不是 API 怎么写,而是调用时机(响应写出前)、参数顺序(ctx 必须第一)、以及 Secret 初始化位置(app.Run 前)——这三个点漏一个,Cookie 就会“看起来没生效”。











