Iris中间件必须用Use()注册且顺序决定执行顺序;写响应后须调用ctx.StopExecution(),否则会导致重复写入或panic;自定义中间件签名须为func(iris.Context);Party内注册仅作用于该分组;ctx.Next()不自动终止链,MVC中间件需通过Before/AfterActivation绑定。

中间件必须用 Use() 注册,且顺序决定执行顺序;写响应后不调用 ctx.StopExecution() 会导致后续中间件或路由处理器继续执行,可能引发重复写入或 panic。
中间件注册必须用 Use(),不能用 UseRouter() 或其他方式
Iris 的中间件入口只有 Use() 方法,它接收一个或多个 iris.Handler 类型函数。常见错误是误用 UseRouter()(该方法用于包装整个路由器,不是注册中间件),或试图在 Party() 外直接调用 Handle() 插入逻辑。
-
app.Use(recover.New())是标准用法,recover.New()返回一个iris.Handler - 自定义中间件必须签名匹配
func(iris.Context),例如:func(ctx iris.Context) { ... } - 若在
Party()分组中注册中间件,只对该分组生效;全局中间件必须在app.Use()中注册 - 多个中间件按
Use()调用顺序入栈,先注册的先执行(即“洋葱模型”外层)
写响应后必须手动调用 ctx.StopExecution()
和 Gin、Echo 不同,Iris 不会自动中断后续处理链。如果中间件里写了响应(比如 ctx.JSON()、ctx.StatusCode()、ctx.Redirect()),但没调用 ctx.StopExecution(),框架仍会继续执行下一个中间件甚至最终的路由处理器,导致 http: multiple response.WriteHeader calls 错误或内容覆盖。
- 典型场景:鉴权中间件检查 token 失败后返回 401:
ctx.StatusCode(iris.StatusUnauthorized); ctx.JSON(...); ctx.StopExecution() - 漏掉
StopExecution()是生产环境最常被忽略的坑,日志里看不到明显报错,但响应体混乱或连接被重置 -
ctx.Next()仅用于让控制权流向下一个中间件,不是“继续执行”的默认行为;它不隐含跳过终止逻辑
BeforeActivation 和 AfterActivation 是 MVC Controller 级中间件绑定点
在 MVC 模式下,你不能直接对某个 Controller 方法加中间件,必须通过 BeforeActivation 或 AfterActivation 钩子操作路由对象。它们在 Controller 注册后、服务器启动前运行,是修改路由元数据的唯一时机。
-
BeforeActivation用于动态注册新路由(如b.Handle("GET", "/custom", "CustomHandler")),适合路径复用或条件路由 -
AfterActivation更常用:通过a.GetRoute("MethodName")获取已注册路由,再修改其Handlers切片,例如前置插入authMiddleware:index.Handlers = append([]iris.Handler{authMiddleware}, index.Handlers) - 注意:这两个方法只在
mvc.Application.Handle()时触发,纯函数式路由(app.Get())不走这套机制
中间件内访问请求上下文要避免提前释放 ctx
Iris 的 Context 对象是复用的,生命周期由框架管理。中间件里不要保存 ctx 引用到 goroutine 或闭包中,尤其不能在异步操作(如 go func() { ... }())里使用它 —— 此时 ctx 可能已被回收,读取 ctx.Params() 或写响应会 panic。
- 正确做法:所有依赖
ctx的逻辑必须同步执行;如需异步,应提取必要字段(如userID := ctx.Values().Get("user_id"))再传入 goroutine - 常见误用:
go func() { ctx.JSON(...) }()→ 极大概率 crash - 调试时可加
ctx.IsStopped()判断是否已被终止,但不能依赖它来规避释放问题


















