beego session 默认关闭,必须显式配置 sessionon=true 才能使用 setsession/getsession,否则触发 nil pointer dereference;需同步设置 sessionprovider(如 redis、file)、sessionname、sessiongcmaxlifetime 等关键参数以保障可用性与安全。

Beego 的 Session 默认是关闭的,不配置就直接用 SetSession 会 panic,必须显式开启并选好存储后端。
sessionon = true 是硬性前提
没这一步,后续所有 SetSession、GetSession 都会触发 nil pointer dereference。错误信息通常是:[config.go:191] Handler crashed with error runtime error: invalid memory address or nil pointer dereference。
- 推荐在
conf/app.conf中配置,注意:行尾不能带注释(sessionon = true # 开启session是非法的) - 代码中开启也行:
beego.BConfig.WebConfig.Session.SessionOn = true,但必须在beego.Run()之前执行 - 如果用了
beego.AppConfig动态加载配置,确保它早于 Session 初始化
选择 sessionprovider 决定数据存哪
默认是 memory,进程一重启全丢,仅适合本地调试。生产环境至少得换一个:
创建全面的交接文档,使新AI代理能够无缝继续工作,消除歧义。解决上下文耗尽问题。 时机:(1)用户请求保存交接,(2)上下文即将满,(3)主要任务完成,(4)会话结束,(5)恢复工作时。 关键词:保存状态、创建交接、上下文已满、暂停、从...恢复、加载交接、保存进度、会话转移、交接
-
file:最轻量,路径设为./.tmp或绝对路径(如/var/tmp/beego_session),注意目录要有写权限 -
redis:高并发首选,SessionSavePath填 Redis 连接串,例如127.0.0.1:6379,0,astaxie(地址,db,密码) -
mysql:需提前建表,表结构见 Beego 文档;SessionSavePath填 DSN,如user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4 - 别用
cookie存敏感数据——它把全部 session 内容加密后塞进 Cookie,体积大、有长度限制、且服务端无控制权
关键参数别漏配,否则行为反直觉
光开开关不够,几个参数直接影响可用性和安全性:
-
SessionName:默认是beegosessionID,建议改成自定义名(如myapp_sid),避免被扫描工具识别框架 -
SessionGCMaxLifetime:服务端 session 过期时间(秒),默认 3600。若用户长时间不操作,session 会被 GC 清掉,但客户端 cookie 还在——下次请求会新建 session,旧数据丢失 -
SessionCookieLifeTime:客户端 Cookie 过期时间(秒),设为 0 表示“浏览器关闭即失效”;设为正数(如 86400)才能实现“7天免登录” -
SessionHashKey:必须改!默认beegoserversessionkey是公开的,攻击者可伪造 session ID。换成随机 32 字节字符串(如用openssl rand -hex 32生成)
SessionID 传不进来?检查 sid 来源链路
Beego 默认只从 Cookie 读 SessionID,但某些场景(如 App、禁 Cookie 浏览器)需要 fallback:
- 启用 URL 传递:
beego.BConfig.WebConfig.Session.SessionEnableSidInURLQuery = true,此时 URL 形如/user?beegosessionID=abc123 - 启用 Header 传递:
beego.BConfig.WebConfig.Session.SessionEnableSidInHTTPHeader = true,服务端从X-Beego-Sessionid读 - 注意:这两个选项默认关闭,且开启后需同步校验来源合法性,否则易被绕过
真正容易被忽略的是:Session GC 是异步 goroutine,SessionGCMaxLifetime 改了但旧 session 不会立刻消失——它只影响新创建 session 的 TTL,已存在的 session 还按旧值计时。上线新配置后,要等最长一个 GC 周期(默认 60 秒)才生效。










