Iris 不自动绑定 Cookie,token 参数无法获取 Cookie 值;须用 ctx.GetCookie("token") 显式读取,SetCookie 应传 http.Cookie{} 并正确配置 Domain(带点)、Path、Secure、HttpOnly 和 SameSite。

必须手动调用 ctx.GetCookie() 和 ctx.SetCookie(),结构体字段或函数参数无法自动绑定 Cookie 值。
为什么 func(c *UserController) Get(ctx iris.Context, token string) 读不到 Cookie?
Iris 的自动绑定只覆盖 URL 路径参数、查询参数(?key=val)、JSON 或表单数据。Cookie 不在该机制范围内。写成 token string 参数,框架完全忽略它——不会从请求头里提取 Cookie: token=abc123,也不会报错,只是传入空字符串。
- 正确做法:在方法体内显式调用
val := ctx.GetCookie("token") -
ctx.GetCookie("missing")返回空字符串,不是 panic,别用!= nil判断 - 如果前端没发 Cookie(比如跨域未配
withCredentials: true),后端永远拿不到,和 Iris 无关
ctx.SetCookie() 容易漏掉的关键参数
直接传 http.Cookie{} 是最稳妥的方式,避免依赖 Iris 封装的简化方法(如 SetCookieKV)隐藏关键配置。
-
MaxAge单位是秒,设为0表示会话级 Cookie(关浏览器即失效);负数表示立即删除 -
Domain必须写成".example.com"(开头带点)才能被子域名共享;写成"example.com"只匹配精确主域名 -
Path推荐设为"/",否则/api/v1请求可能不携带/user下设置的 Cookie -
Secure: true在 HTTPS 环境下必须开启,否则浏览器拒绝发送 -
HttpOnly: true防 XSS,不影响后端读取,但前端 JS 无法访问
前端发不出 Cookie?先查 SameSite 和 withCredentials
用户从 app.example.com 点链接跳转到 api.example.com,后端 GetCookie 返回空,大概率是浏览器策略拦截,不是代码问题。
- 默认
SameSite: Lax会阻止跨站 GET/POST 请求携带 Cookie(包括链接跳转、表单提交) - 若需跨域携带,服务端 SetCookie 时得设
SameSite: http.SameSiteNoneMode,且必须同时配Secure: true - 前端 fetch/AJAX 必须显式加
credentials: "include"(等价于withCredentials: true),否则浏览器根本不会附带 Cookie - Chrome 80+ 对
SameSite=Lax执行更严格,本地开发用localhost可能侥幸通过,上线后必现
真正麻烦的不是语法,而是 Cookie 的行为由浏览器、协议规范、前后端配置三方共同决定。少设一个 .、漏配一个 Secure、前端忘了 credentials,都会让 GetCookie 返回空字符串,而且没有任何错误提示——它就安静地返回 ""。


















