session必须在mvc应用启动前注册,否则controller中session字段为nil;需先创建sessions.new()管理器,再通过mvcapp.register(sessionmanager.start)注入,controller中用session.set/get持久化数据,flash仅限下一次请求,重定向前须调用commit()。

Session对象必须在MVC应用启动前注册
不提前注册sessions.Session,Controller里拿到的Session字段永远是nil。Iris的MVC层不会自动注入Session实例,必须手动绑定到依赖容器或通过app.Configure显式挂载。
常见错误现象:Controller中声明Session *sessions.Session字段,但调用session.Set("user_id", 123)时 panic:nil pointer dereference。
- 先创建Session管理器:
sessions.New(sessions.Config{Cookie: "myapp_session", Expires: 24 * time.Hour}) - 再注册进MVC应用:
mvcApp.Register(sessionManager.Start)(注意传的是Start函数,不是实例) - Controller结构体中字段类型保持为
*sessions.Session,Iris会自动调用Start并注入活跃会话实例
Controller里读写Session要区分Get/Set和Flash操作
session.Get/session.Set用于跨请求持久化数据(如登录态、用户ID),而session.GetFlash/session.SetFlash只在下一次请求有效,适合一次性提示消息(如“密码修改成功”)。
容易踩的坑:误用SetFlash存用户ID,结果第二次请求就丢失,导致反复跳转登录页。
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
- 登录成功后存用户信息:
c.Session.Set("user_id", userID) - 登出时清除:
c.Session.Destroy()(彻底删除服务端Session)或c.Session.Clear()(仅清空键值,保留Session ID) - 重定向前务必调用
c.Session.Commit()——虽然多数情况自动触发,但在ctx.Redirect后立即结束请求时可能来不及刷写Cookie
Session中间件要放在MVC路由注册之前
如果用app.Use(sessionManager.Handler())方式全局启用Session,必须在mvc.New(...).Handle(...)之前调用。否则MVC路由匹配完成才执行中间件,Controller里的Session字段拿不到已解析的会话。
性能影响:每个请求都会解密/验证Session Cookie。若不需要全站Session(比如/public路径下静态资源),应避免全局注册,改用app.Party("/auth").Use(...)按需启用。
- 正确顺序:
sessionManager := sessions.New(...)→app.Use(sessionManager.Handler())→mvc.New(app.Party("/")).Handle(new(AuthController)) - 若Controller只在
/admin下生效,优先用分组中间件:adminGroup := app.Party("/admin"); adminGroup.Use(sessionManager.Handler()); mvc.New(adminGroup).Handle(new(AdminController))
Session过期与并发读写要注意原子性
Iris的sessions.Session本身不是线程安全的——同一请求内多次Set没问题,但若Controller方法里启了goroutine异步写Session(比如记录日志+更新最后活跃时间),可能触发panic或数据覆盖。
容易被忽略的地方:Session默认基于内存存储,重启服务后所有会话丢失;生产环境必须切换为Redis等外部存储,且需确认sessions.Redis驱动已正确配置Config.Expires和Config.DisableSubdomain等关键项。
- 避免并发写:
session.Set和session.Get都在同一线程内完成,不要把session对象传给goroutine - 检查是否过期:用
session.ID()非空 +session.IsExpired()双重判断,不能只靠session.Get("user_id") != nil - Redis存储示例:
sessions.New(sessions.Config{...}).UseDatabase(redisDB),其中redisDB是redigo.Conn或go-redis.Client适配器










