beego中间件必须显式调用web.insertfilter注册才生效,注册顺序即请求执行顺序、响应逆序执行;常用时机为web.beforerouter(路由前鉴权等)和web.afterexec(控制器后加头等),函数签名须为func(*web.context),中断需用c.abort()或c.stoprun()。

Beego 的中间件(官方称 Filter)不是可选插件,而是请求生命周期中必须显式注册才能生效的拦截逻辑;不注册就完全不执行,不存在“默认启用”或“自动发现”机制。
Beego 中间件必须用 web.InsertFilter 注册,且顺序决定执行顺序
Beego 不像某些框架通过装饰器或配置自动加载中间件。所有中间件都得手动调用 web.InsertFilter 注册,且注册顺序 = 请求进入时的执行顺序,响应返回时则逆序执行。
-
web.InsertFilter第一个参数是匹配路径(支持通配符*或具体路由如/api/*),第二个是过滤器类型(web.BeforeRouter、web.AfterExec等),第三个是函数值 - 常见位置:通常写在
main.go的init()或main()开头,在web.Run()之前 - 错误示例:
web.InsertFilter("/user", web.BeforeRouter, myAuth)写在web.Run()之后 —— 完全不会生效 - 路径匹配注意:
/api/不会匹配/api/users,得写成/api/*或/api/.*
web.BeforeRouter 和 web.AfterExec 是最常用的两个执行时机
Beego 定义了多个过滤器执行点,但实际高频使用的只有两个:路由匹配前和控制器执行后。其他如 web.BeforeExec(路由匹配后、Prepare 前)或 web.FinishRouter(响应写出后)极少需要,过早介入反而容易破坏框架内部状态。
-
web.BeforeRouter:请求刚进来、还没做任何路由判断,适合做全局鉴权、日志起始、CORS 预检处理 -
web.AfterExec:控制器方法(Get/Post)已执行完、响应数据已生成但尚未写出,适合加统一响应头、记录耗时、清理临时资源 - 别误用
web.BeforeExec做权限检查:此时路由已匹配、Prepare()已执行,this.Ctx.Input.Param可能还未初始化完整 - 若需在控制器内访问中间件设置的数据,用
c.Ctx.Input.SetData("key", value),再在 Controller 里用c.Ctx.Input.GetData("key")
中间件函数签名必须是 func(*web.Context),不能带返回值
Beego 的 Filter 函数不是“中间件链”中可中断的 next() 调用模式,它没有返回值,也不接受 next 参数。是否中断后续流程,靠的是直接操作 c.Abort() 或 c.StopRun()。
- 正确签名:
func(c *web.Context) { ... }—— 所有自定义 Filter 必须严格匹配 - 想终止请求并返回 401?写
c.Abort(401),它会跳过后续 Filter 和 Controller,直接写出响应 - 想终止但不写响应(比如重定向)?用
c.Redirect(302, "/login")+c.StopRun(),否则重定向后还会继续执行 Controller - 常见坑:
return语句本身不会中断流程,必须显式调用Abort或StopRun - 不要试图在 Filter 里调用
c.ServeJSON()或c.TplName—— 此时响应体可能已被部分写出,行为不可控
开发调试阶段务必检查 web.BeeApp.Handlers 是否包含你的 Filter
Beego 启动后,所有注册的 Filter 都会存进 web.BeeApp.Handlers 这个 map。如果中间件没生效,第一反应不是查逻辑,而是确认它是否真被注册进去了。
- 在
main()末尾加一行:fmt.Printf("registered filters: %+v\n", web.BeeApp.Handlers) - 输出里应看到类似
map[BeforeRouter:[{...} {...}]],若对应时机(如BeforeRouter)下为空,说明InsertFilter没执行或路径不匹配 - 注意:Beego v2 使用
github.com/beego/beego/v2/server/web包路径,导入错包(比如用了旧版github.com/astaxie/beego)会导致InsertFilter调用静默失败 - 测试时用
curl -v http://localhost:8080/your-path观察响应头和状态码,比只看终端日志更可靠
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











