子域名间共享Session最容易失败的环节是CookieDomain未加前导点(如".example.com")及Redis的Database和Prefix未对齐;前者导致浏览器不跨子域发送Cookie,后者引发key冲突或误清理。

子域名间共享 session 最容易失败的环节,不是代码写错,而是 CookieDomain 没加点、Redis 的 Database 和 Prefix 没对齐。
为什么 ctx.GetCookie("session_id") 总是空
浏览器 DevTools 里明明能看到 session_id 这个 Cookie,但后端 ctx.GetCookie("session_id") 返回空字符串——这不是 Iris 读不了,是浏览器根本没发过来。
根本原因在于服务端写入 Cookie 时没设对 Domain:
-
Domain: "example.com"→ 只匹配精确域名,admin.example.com和api.example.com互不可见 -
Domain: ".example.com"→ 开头带点,才允许所有子域名共享(注意这个点不能少)
Iris 的 sessions.Sessions 不会自动推导跨域逻辑,必须显式配置:
sess := sessions.New(sessions.Config{
Cookie: "mysessionid",
CookieDomain: ".example.com", // 必须带点
CookiePath: "/",
CookieSecure: true, // 生产环境 HTTPS 下必须为 true
CookieHTTPOnly: true,
})
Redis 存储必须指定 Database 和 Prefix
多实例部署(比如 Kubernetes 多副本)下,如果 Redis 配置只写了地址,几乎必然出现“用户频繁登出”问题。
原因有两个:
- 云 Redis(如 AWS ElastiCache)默认禁用
SELECT命令,不设Database就固定连到db 0,和其他服务冲突 - 没设
Prefix会导致DestroyAll()清掉别人家的 session key
正确写法示例:
redisStore := redis.New(redis.Config{
Network: "tcp",
Addr: "redis.example.com:6379",
Password: "xxx",
Database: 1, // 显式指定 db 1
Prefix: "myapp:sess:", // 避免 key 冲突
})
sess.UseDatabase(redisStore)
SameSite 导致前端跳转后 Cookie 丢失
用户从 app.example.com 点链接跳到 api.example.com,新页面里 GetCookie 为空——这不是后端 bug,是浏览器主动拦截。
CookieSameSite 默认是 http.SameSiteLaxMode,跨站 GET 请求在某些场景下不携带 Cookie。解决方法只有两个:
- 前端改用
fetch或XMLHttpRequest发起请求(同源或 CORS 配合),而不是靠 a 标签跳转 - 后端显式关闭 SameSite(仅限可信内网场景):
CookieSameSite: http.SameSiteNoneMode,但此时CookieSecure: true必须同时开启,否则浏览器拒绝设置
本地开发和线上环境的配置差异陷阱
本地 localhost 下一切正常,一上生产就失效,大概率踩了这几个坑:
-
CookieSecure: true在 HTTP 环境下会导致浏览器直接丢弃 Cookie(必须配 HTTPS 或反向代理透传X-Forwarded-Proto) -
CookieDomain: ".localhost"是非法值,浏览器不认;本地调试只能留空或设为"localhost"(不带点) - 不同环境连的 Redis 实例没区分
Database和Prefix,测试环境清 session 把线上也干掉了
建议按环境拆 config,用 os.Getenv("ENV") 控制开关,而不是硬编码。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











