Beego 的 Session 默认关闭,必须显式启用:代码方式为 beego.BConfig.WebConfig.Session.SessionOn = true(置于 beego.Run() 前),或配置文件方式在 conf/app.conf 中写 sessionon = true;二者任选其一,且需配合正确设置 SessionProvider(如 memory/file/redis)及生命周期参数(SessionGCMaxLifetime 和 SessionCookieLifeTime),否则 SetSession 无效、GetSession 恒返回 nil。

Beego 的 Session 默认是关闭的,不手动开启就完全不生效——哪怕你调用了 SetSession 也存不进任何数据,浏览器里连 beegosessionID Cookie 都不会出现。
如何正确开启 Session 功能
必须显式启用,两种方式任选其一,不能只改配置不重启、也不能只写代码不调用 Run():
- 代码方式:在
main()函数中beego.Run()之前设置beego.BConfig.WebConfig.Session.SessionOn = true - 配置文件方式:在
conf/app.conf中添加sessionon = true(注意不是session_on或其他变体) - 如果同时用了两种方式,以代码为准;但建议统一用配置文件,方便不同环境切换
常见错误:只在 controller 里调用 this.SetSession() 却没开启全局开关,日志无报错,但 GetSession 始终返回 nil。
Session 存储后端怎么选:memory / file / redis
SessionProvider 决定数据存在哪,直接影响重启是否丢数据、并发是否安全:
立即学习“go语言免费学习笔记(深入)”;
-
"memory":默认值,进程内 map,开发调试快,但服务重启即清空,**不适合生产** -
"file":写入本地文件,重启不丢,路径由SessionProviderConfig指定(如"./.session"),注意目录需有写权限 -
"redis":高并发首选,需额外安装github.com/gomodule/redigo/redis,配置格式为"127.0.0.1:6379,0,astaxie"(地址,db,密码)
别漏设 SessionProvider:只开 SessionOn 不设 provider,beego 仍会 fallback 到 memory,你以为配了 redis 其实没生效。
Session 生命周期与 Cookie 行为差异
Session 过期由两个时间共同控制,容易混淆:
-
SessionGCMaxLifetime(或配置项sessiongcmaxlifetime):服务端数据最大存活秒数,默认 3600(1 小时)。超时后 GC goroutine 清理,key 彻底消失 -
SessionCookieLifeTime(或配置项sessioncookielifetime):发给浏览器的 Cookie 有效期,默认 0,即“浏览器关闭即失效”。设为 3600 才会让 Cookie 本身也活 1 小时 - 两者不一致时,用户可能看到 Cookie 还在,但
GetSession返回nil(服务端已删);或 Cookie 已过期,但服务端数据还在(只是无法再关联)
另外:GetSession 返回 nil,不是空字符串,类型断言失败会 panic,务必先判空再转类型,比如 if v := c.GetSession("user"); v != nil { name := v.(string) }。
SetSession / GetSession / DelSession 的实际行为
这些方法封装了底层 session.Manager,但要注意边界情况:
-
SetSession("k", nil)是合法的,但取出来仍是nil,和“未设置”无法区分;建议避免存nil -
DelSession("k")只删单个 key;DestroySession()才清空整个 session 并删除客户端 Cookie -
SessionRegenerateID()会换掉当前 session ID,用于登录成功后防会话固定攻击,但会丢失原有数据,需手动迁移 - 所有操作都依赖
c.Ctx.Request和c.Ctx.ResponseWriter,跨 goroutine 调用(如异步任务里)会出错
最常被忽略的一点:Session ID 本质靠 Cookie 传递,如果前端禁用 Cookie 或跨域请求未带 credentials: 'include',StartSession 拿到的其实是新 session,老数据不可达——这不是 beego 的 bug,是 HTTP 协议约束。


















