revel 框架默认不启用 session,需在 app.conf 中显式配置 session.type、session.cookie.secure、session.cookie.httponly 和 session.secret;controller 中通过 c.session 读写,数据加密存储于客户端 cookie,服务端无状态解析。

Revel 框架默认用 session 存储用户状态,但必须显式启用且注意 Cookie 安全配置
Revel 默认不自动开启 session 支持,即使你调用了 session.Set() 也不会持久化。必须在 app.conf 中启用并配置 session.cookie.secure 和 session.cookie.httpOnly,否则本地开发可能看似正常,部署到 HTTPS 环境后会静默失效。
-
session.type = cookie(默认)或redis,前者简单但有大小限制(约 4KB),后者需额外服务且要配置session.redis.addr -
session.cookie.secure = true在生产环境必须设为true,否则浏览器拒绝发送带 Secure 标志的 Cookie(尤其 Nginx 反向代理后容易漏配) -
session.secret = "your-32-byte-secret"必须设置,且长度建议 32 字节(AES-256),短于 16 字节会降级为不安全的 CBC 模式
在 Controller 中读写 session 要用 c.Session,不是全局变量或中间件手动注入
Revel 的 Controller 结构体已嵌入 Session 字段,直接使用即可。别试图用 revel.Session 类型声明新变量,也别在中间件里“提前”存值——session 数据只在 FinishRequest 阶段序列化并写入响应 Cookie。
- 存值:
c.Session.Set("user_id", 123)—— 此时只是缓存在内存,未加密写入 - 取值:
id := c.Session.Get("user_id")—— 返回interface{},需类型断言,如id.(int) - 删除:
c.Session.Clear()清空全部;c.Session.Delete("token")删除单个键 - 注意:若在
Filter中修改c.Session,必须确保该 Filter 在REVEL_FILTERS列表中位于SESSION_FILTER之后,否则修改会被覆盖
session.cookie.maxage 控制有效期,但实际过期由客户端和服务端双重校验
设 session.cookie.maxage = 3600 表示 Cookie 过期时间(秒),但 Revel 不做服务端 session 过期清理 —— 它是无状态 Cookie 方案,所有数据加密后存在客户端。所以“过期”仅影响浏览器是否发送该 Cookie,服务端解密后仍可读(只要密钥没变、数据没篡改)。
- 若需强制服务端过期(例如用户登出后禁止重放),得自己加逻辑:比如存一个随机
session_token到 DB,每次请求校验它是否被标记为无效 -
session.cookie.maxage = 0表示 Session Cookie(关闭浏览器即失效),不是“永不过期” - 时间单位是秒,不是毫秒,填错会导致会话瞬间过期(如误填
3600000)
调试 session 失效问题,优先检查 Set-Cookie 响应头和浏览器 DevTools 的 Application → Cookies
Revel 不报错也不打日志来提示 session 写入失败,只能靠观察响应头和浏览器行为判断。
- 用
curl -v或浏览器 Network 面板看响应头是否有Set-Cookie: REVEL_SESSION=...,没有说明配置未生效或session.type被设为none - 检查浏览器 Cookies 列表中该域名下是否有
REVEL_SESSION,Domain/Path 是否匹配(默认Path=/,若应用部署在子路径如/api,需手动设session.cookie.path = "/api") - 如果值是明文或 base64 编码,说明
session.secret为空或太短,加密未触发











