Session/Cookie 与会话存储
结论:Session 通过 r.Session 读写(Set/Get/Remove/Clear),会话存储介质可插拔(文件/内存/Redis 等),生产多实例部署必须切换为共享存储(如 Redis),否则登录态在各实例间不一致;Cookie 通过 r.Cookie 读写,注意只放非敏感数据并开启安全属性。
一、核心要点
- SessionId 通过 Cookie 在客户端与服务端间传递,请求自动携带。
- 存储 Adapter:gsession 提供 StorageFile、StorageMemory、StorageRedis 等(默认存储介质与切换方式以官方文档为准)。
- 多实例会话:实例 A 写入的会话若只在本地,实例 B 将无法识别 → 必须用 Redis 等共享存储。
- Cookie:不要存放敏感信息;生产开启 HttpOnly、Secure、合适的 SameSite(具体 API 以官方文档为准)。
代码示例
// 登录后写入会话
err := r.Session.Set("uid", 1)
// 读取
uid := r.Session.Get("uid").Int()
// 鉴权中间件风格
if r.Session.Get("uid").IsNil() {
r.Response.WriteStatusExit(401)
}
// 登出
_ = r.Session.Remove("uid") // 或 Clear() 清空全部
// Cookie 读写
r.Cookie.Set("theme", "dark")
theme := r.Cookie.Get("theme").String()
r.Cookie.Remove("theme")
常见追问 / 记忆点
- 追问:Session 存内存有什么坑?→ 进程重启/多副本部署都会丢,生产默认应评估是否切 Redis 存储。
- 追问:Cookie 与 Session 的区别?→ Cookie 存客户端、Session 存服务端(只把 Id 放 Cookie);服务端会话状态用 Session。
- 记忆点:r.Session 管登录态、r.Cookie 管轻量标识;多实例必须共享会话存储;敏感数据别进 Cookie。