app.Use()必须在app.Run()前调用且注册顺序决定执行顺序,全局中间件需用app.Use()而非路由内注册,遗漏ctx.StopExecution()或app.Options()会导致越权或跨域失败。

必须用 app.Use(),且必须在 app.Run() 或 app.Listen() 之前调用,否则中间件完全不执行。
全局中间件注册位置不能错
很多人写完中间件函数,直接塞进路由里:app.Get("/api/user", authMiddleware, handler)——这只能保护单个路由。真要“全局”生效,得调用 app.Use()。
常见错误现象:中间件函数写了,也传进去了,但日志没打、token 没校验、请求照样进 handler——大概率是注册位置错了,比如写在 app.Run() 之后,或漏掉了 app.Use() 调用本身。
-
app.Use()必须在app.Run()或app.Listen()之前调用,否则不生效 - 多个
app.Use()按注册顺序执行,先注册的先运行 -
app.UseGlobal()是旧版别名(v12 已标记弃用),文档里不提,但实际仍可用;不过官方推荐统一用app.Use(),避免混淆
中间件函数里不调 ctx.StopExecution() 就会越权
Iris 不会自动中断后续链路,哪怕你已经调了 ctx.JSON(401, ...) 或 ctx.StatusCode(401),只要没显式调 ctx.StopExecution(),ctx.Next() 之后的中间件和最终 handler 依然会执行。
立即学习“go语言免费学习笔记(深入)”;
典型场景:JWT 验证失败,你返回了 ctx.JSON(401, map[string]string{"error": "invalid token"}),但忘了加 ctx.StopExecution(),结果业务 handler 还是跑了一次,可能查了 DB、改了状态,造成越权操作。
- 所有提前返回逻辑(如校验失败、权限拒绝)之后,必须跟
ctx.StopExecution() -
ctx.Next()只负责移交控制权,不自动终止后续逻辑 - 不要在中间件里重复调用
ctx.Next(),它只该出现一次,且应在确定继续时才调
跨域中间件必须配 app.Options() 才能生效
Iris 不会自动捕获预检请求(OPTIONS)。如果你只在中间件里判断 ctx.Method() == "OPTIONS",但没在路由表中注册对应路径的 handler,Iris 就不会触发该中间件——因为路由未匹配,中间件压根不执行。
错误写法:app.Use(corsMiddleware) 后不注册任何 OPTIONS 路由 → 前端报错 Response to preflight request doesn't pass access control check。
- 若 API 分组在
api := app.Party("/api")下,也得单独写api.Options("*", ...) - Cors 中间件要设全关键头:
Access-Control-Allow-Origin(生产禁用 "*")、Access-Control-Allow-Methods、Access-Control-Allow-Headers -
Access-Control-Allow-Credentials: "true"时,Access-Control-Allow-Origin不能为 "*",必须是具体 origin(如"http://localhost:3000")
用户数据传递必须用 ctx.Values().Set() + 类型安全取值
认证通过后,不要在每个 handler 里重复解析 token,而应把用户 ID 或结构体塞进 ctx.Values().Set("user", user),下游再用 ctx.Values().Get("user") 拿。
容易踩的坑是类型断言不安全:如果没做空值判断就直接 user := ctx.Values().Get("user").(*model.User),一旦中间件没执行或出错,运行时 panic。
- 务必先判空:
v := ctx.Values().Get("user"); if v == nil { ... } - 再做类型断言,并检查是否成功:
if user, ok := v.(*model.User); ok { ... } - 不要依赖
ctx.Request().Context()或全局变量传用户数据,会破坏请求隔离性
最常被忽略的是 ctx.StopExecution() 和 app.Options() 的组合缺失——一个导致越权,一个导致跨域失败,两者都不报错,但行为完全不符合预期。


















