Beego中添加中间件唯一可靠方式是beego.InsertFilter(),必须在beego.Run()前注册,路径需带结尾斜杠(如"/api/"),静态资源拦截必须用beego.BeforeStatic阶段,且需单独编写逻辑。

beego.InsertFilter 是唯一可靠的注册入口
Beego 的中间件不能靠“在函数里判断路径再 return”来实现条件生效,那样会破坏 filter 链语义、漏掉 beego.BeforeStatic 等阶段,且 ctx.Next() 可能已部分执行。真正可控的方式只有 beego.InsertFilter。
它接受四个参数:path(前缀字符串)、filterType(过滤点类型)、filterFunc(中间件函数)、可选的 returnOnOutput(bool,默认 false)。
-
path必须带结尾斜杠才安全,比如"/api/",否则"/api"会误匹配/apixxx -
filterType不能硬写数字,要用常量:beego.BeeApp.FilterType(路由前)、beego.BeforeStatic(静态资源前)、beego.AfterStatic(静态后但路由前) - 注册必须在
beego.Run()之前完成,通常放在main.go的init()或main()开头 - 多个同路径注册按调用顺序叠加,后注册的先执行(栈式)
beego.BeforeStatic 是拦截静态资源的唯一机会
默认情况下,/static/xxx、/public/yyy 这类请求完全绕过路由系统和常规 filter,beego.InsertFilter("/static/", beego.BeeApp.FilterType, ...) 对它们无效——这不是 bug,是 Beego 的设计选择。
想控制静态资源访问权限(比如只允许登录用户下载 /static/private/ 下的文件),必须用 beego.BeforeStatic:
- 注册示例:
beego.InsertFilter("/static/private/", beego.BeforeStatic, authCheckForStatic) - 此时
ctx.Input.Data为空,c.TplName、c.Layout等 controller 字段不可用,只能操作c.Ctx.Request和c.Ctx.ResponseWriter - 若需同时控制 API 路由 + 静态资源,得写两套逻辑,分别注册到
beego.BeeApp.FilterType和beego.BeforeStatic
POST 限制必须在中间件内手动判断 Method
Beego 没有类似 beego.PostFilter() 的语法糖,HTTP 方法过滤全靠中间件自己判断。
正确做法是在中间件开头加一行判断:
func onlyPostMiddleware(ctx *context.Context) {
if ctx.Ctx.Request.Method != "POST" {
ctx.Next()
return
}
// 后续处理:ParseForm、校验 body、记录日志等
ctx.Next()
}
- 用
==就够了,不用strings.EqualFold或正则,性能差且没必要 - 如果中间件里调了
ctx.ParseForm()或读ctx.Ctx.Request.Body,必须确保只在POST/PUT/PATCH中执行,否则 GET 请求会卡住 - 组合路径 + 方法时,优先用
InsertFilter("/api/login", ...)缩小范围,再在函数内判Method,比全量判断更高效
beego.Router 和 beego.Get 注册的中间件行为不同
用 beego.Router("/user/:id", &UserController{}) 注册的路径,中间件能完整访问 c.Data、c.TplName、Session、ORM 等 controller 上下文;而 beego.Get("/health", func(c *context.Context) { ... }) 是裸函数,中间件虽能执行,但 c 不是 *Controller 实例,c.Data 始终为空,模板、Session、自动注入全部失效。
- 如果你的中间件依赖
c.Input.Session.Get("user_id"),它在beego.Get路由里永远拿不到值 - 混用两种方式注册同一路径(比如先
Router后Get),后者会覆盖前者,且失去所有 MVC 能力 - 健康检查、简单转发、集成第三方 handler 等场景可用
beego.Get;需要 Session、模板、Filter 链联动的,必须用Router + Controller


















