Iris默认不启用Session,必须先调用app.Use(session.Handler())注册中间件,再注册路由,否则sessions.Default(ctx)返回nil导致panic;sess.Save()必须显式调用才能持久化数据,且需置于重定向前。

Iris 默认不启用 Session,必须手动注册中间件,否则调用 sessions.Default(ctx) 会 panic 报错「session is not registered」。
为什么 app.Use(session.Handler()) 必须放在路由注册之前
Session 实例是通过中间件注入到请求上下文的。如果把 app.Use(session.Handler()) 放在 app.Get() 或 app.Post() 之后,后续 handler 拿不到绑定的 session 实例,sessions.Default(ctx) 返回 nil,一调用 Set() 就 panic。
- 正确顺序:先
app.Use(session.Handler()),再注册所有路由 - 开发阶段可直接用内存存储:
session.Handler()不传参即可 - 生产环境务必换 Redis:
session.Handler(redis.New(...)),避免进程重启丢失会话 - Cookie 安全选项需显式开启:
session.Handler().Cookie("mysession", session.Config{HttpOnly: true, Secure: true})
登录后存 user_id 为什么必须调 sess.Save()
Iris 的 session 是延迟写入机制:sess.Set("user_id", 123) 只是修改内存副本,不调 sess.Save() 就不会真正写入 store,下一次请求仍读不到值。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 只存最小标识,如
user_id(int)或session_token(string),别存完整用户结构体 -
sess.Set()接受任意类型,但建议统一转 string 或用GetInt()/GetString()显式取值 - 保存失败时要检查
err,不能忽略:if err != nil { /* 处理错误 */ } - 示例中常见漏写:
sess.Save()写在ctx.Redirect()后面 → 实际没执行就返回了
校验登录状态时 sess.Get("user_id") 返回 nil 怎么办
sess.Get("user_id") 在 key 不存在、过期或 store 读取失败时都返回 nil,不是零值(比如 0 或 ""),直接断言 int 会 panic。
- 先判空:
if userID := sess.Get("user_id"); userID != nil { ... } - 再做类型安全转换:
if id, ok := userID.(int); ok && id > 0 { ... } - 推荐封装成中间件,在路由前统一拦截:
if !isAuthenticated(ctx) { ctx.Redirect("/login", 302); return } - 登出必须用
sess.Destroy(),而不是只删 key —— 否则旧 session ID 仍可能被重放
Session 管理最易被忽略的是生命周期绑定和销毁时机:服务端过期时间、客户端 Cookie MaxAge、HTTPS 下的 Secure 标志、以及登出时是否真正清除 store 中的数据 —— 这四点缺一不可,否则看似“已退出”,实际 token 仍有效。

















