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。
笔记加载中…