beego中session必须显式开启,否则setsession无效;需在app.conf设sessionon=true或代码中启用;cookie过期时间单位为秒;session依赖cookie传输beegosessionid;登出应使用destroysession而非delsession。

Beego中Session必须显式开启,否则SetSession等方法无效
Beego默认关闭Session功能,哪怕你调用了c.SetSession("user", "admin"),也不会写入任何数据——没有报错,但后续c.GetSession("user")始终返回nil。这是最常踩的坑。
开启方式有两种,**二选一即可**,不要同时用:
- 在
main.go中beego.Run()前加:beego.BConfig.WebConfig.Session.SessionOn = true - 在
conf/app.conf里写:sessionon = true(注意是小写sessionon,不是SessionOn)
如果用配置文件方式,还建议顺手配好sessionprovider,比如sessionprovider = redis,否则默认走memory——进程重启后所有Session丢失,本地开发容易误以为“功能坏了”,其实是预期行为。
SetCookie第三个参数是秒级过期时间,传0或负数会变成会话级Cookie
c.Ctx.SetCookie("token", "abc123", 3600, "/")中的3600单位是秒,不是毫秒,也不是分钟。这点和前端document.cookie习惯不同,容易填错。
常见误区:
- 填
3600 * 24想存一天?没问题,但要注意浏览器实际是否遵守——部分浏览器对超长有效期会自动截断或降级 - 填
0:Cookie只在当前浏览器标签页生命周期内有效,关掉标签即失效 - 填负数(如
-1):效果同0,不是“永不过期” - 留空或传
nil:Beego会使用默认值3600(1小时),不是“浏览器默认”
路径参数"/"决定Cookie作用域;若设为"/api",则只有/api/xxx请求才带该Cookie,根路径访问拿不到。
Session依赖Cookie传输beegosessionID,禁用Cookie会导致Session完全失效
Beego的Session机制本质是:服务端生成一个随机beegosessionID,通过Cookie发给浏览器;后续每次请求,浏览器自动带上这个ID,Beego再用它查后端存储(memory/redis/file等)。
这意味着:
- 如果用户浏览器禁用Cookie,
c.StartSession()仍能执行,但每次都会新建一个Session,GetSession永远读不到之前存的值 -
SessionName默认是"beegosessionID",可在app.conf里改,例如sessionname = "my_sid",但改名不解决Cookie被禁的问题 - 没有内置的URL传参 fallback(如
?sid=xxx),如需支持无Cookie场景,得自己解析Query并手动调用GlobalSessions.SessionExist()等底层方法
别指望SetSession能绕过Cookie——它只是往当前Session对象写数据,而这个对象的绑定完全靠Cookie里的ID。
DelSession和DestroySession的区别直接影响登出逻辑
用户点击“退出登录”时,仅调c.DelSession("user")是不够的——它只删掉"user"这个键,Session ID依然有效,其他键(如"role"、"last_login")还在,且新请求仍能复用该Session。
正确做法是:
- 普通登出:
c.DestroySession()—— 删除整个Session数据 + 清除响应头中的beegosessionIDCookie - 只清理部分字段(如更新用户名但保留登录态):
c.DelSession("old_name")+c.SetSession("new_name", ...) - 强制让旧ID彻底失效(防会话固定攻击):
c.SessionRegenerateID(),它会生成新ID、销毁旧Session、并设置新Cookie
DestroySession()不会立即从后端存储(如Redis)物理删除数据,而是标记为过期;真正清理靠后台GC协程,间隔由sessiongcmaxlifetime控制,默认3600秒。
Session ID 的生成、传输、校验链条很短,但任意一环断开(配置漏开、Cookie路径写错、浏览器策略拦截、后端存储不可达)都会导致“看起来没报错,但就是不生效”。调试时优先检查Network面板里的请求头Cookie和响应头Set-Cookie是否存在beegosessionID字段,比翻代码更快。











