beego v2 中 session 已内置无需单独安装,必须显式开启(配置文件设 sessionon = true 或代码设置 sessionon = true),默认 memory 引擎重启即失,生产需切换如 file/redis 引擎,并注意 cookie 依赖及配置语法严格性。

Beego v2 中 session 模块已内置,无需单独安装
Beego v2(github.com/beego/beego/v2)的 session 功能直接集成在 server/web 包中,不是独立模块。你不需要执行 go get github.com/astaxie/beego/session —— 这是 Beego v1 时代的旧用法,v2 下会引发包冲突或未定义行为。
启用 session 必须显式开启,否则 SetSession/GetSession 会 panic
即使导入了 github.com/beego/beego/v2/server/web,若未开启 session,调用 c.SetSession 时会触发 nil pointer dereference 错误(常见报错:[config.go:191] Handler crashed with error runtime error: invalid memory address or nil pointer dereference)。
开启方式二选一,**不能同时省略**:
- 配置文件方式(推荐):在
conf/app.conf中添加一行(注意:该行后不能跟任何注释,包括空格后加#):sessionon = true
- 代码方式:在
main()函数中、beego.Run()调用前设置:beego.BConfig.WebConfig.Session.SessionOn = true
默认使用 memory 引擎,但重启即丢失,生产环境必须换
Beego v2 默认 session 存储引擎是 memory,所有 session 数据驻留在进程内存里。只要应用重启、崩溃或被 kill,全部 session 立即清空 —— 这在 demo 或本地调试可以接受,但上线等于没开。
切换引擎需三步配置(以 file 为例):
- 指定引擎:
beego.BConfig.WebConfig.Session.SessionProvider = "file"
- 提供路径(可选,默认为系统临时目录):
beego.BConfig.WebConfig.Session.SessionProviderConfig = "./.tmp"
- 确保目录可写(例如 Linux 下
chmod 755 ./.tmp),且路径存在(Beego 不自动创建父目录)
其他可用引擎(如 redis、mysql)需额外导入驱动并填写完整连接字符串,SessionProviderConfig 字段内容格式因引擎而异。
Session ID 依赖 Cookie,禁用 Cookie 就失效
Beego 的 session 机制默认通过 Cookie 传递 sessionid,字段名由 SessionName 配置项控制(默认 gosessionid)。如果客户端浏览器禁用 Cookie,或请求头中不带该 Cookie,c.GetSession 总是返回 nil,且每次请求都会生成新 session。
没有“自动 fallback 到 URL 参数”机制。如需支持无 Cookie 场景,必须自行解析 URL 查询参数(如 ?sid=xxx),再手动调用 globalSessions.SessionExist 和 globalSessions.SessionStart —— 但这绕过了框架封装,容易出安全和并发问题,不建议常规使用。
真正容易被忽略的是:session 配置必须在 beego.Run() 之前完成,且 app.conf 的语法极其严格——等号前后不能有空格,行尾不能有注释,否则整个配置项被忽略,表现就是“明明写了 sessionon = true 却还是 panic”。











