beego——过滤器
beego支持自定义过滤中间件,例如安全验证、强制跳转等。
过滤器函数如下所示:
1 | beego.InsertFilter(pattern string, position int, filter FilterFunc, params ...bool) |
InsertFilter函数的有三个必填参数和一个可选参数。
(1)pattern
路由规则,可以根据一定的规则进行路由,如果你全匹配可以用*。
(2)position
执行Filter的地方,五个固定参数如下所示,分别表示不同的执行过程。
- BeforeStatic 静态地址之前
- BeforeRouter 寻找路由之前
- BeforeExec 找到路由之后,开始执行相应的Controller
- AfterExec 执行完Controller逻辑之后执行的过滤器
- FinishRouter 执行完逻辑之后执行的过滤器
(3)filter
函数 type FilterFunc func(*context.Context)
(4)params
设置 returnOnOutput 的值(默认 true), 是否允许如果有输出是否跳过其他 filters,默认只要有输出就不再执行其他 filters。
是否重置 filters 的参数,默认是 false,因为在 filters 的 pattern 和本身的路由的 pattern 冲突的时候,
可以把 filters 的参数重置,这样可以保证在后续的逻辑中获取到正确的参数,
例如设置了 /api/*
的 filter,同时又设置了 /api/docs/*
的 router,那么在访问 /api/docs/swagger/abc.js
的时候,
在执行 filters 的时候设置 :splat
参数为 docs/swagger/abc.js
,但是如果不清楚 filter 的这个路由参数,
就会在执行路由逻辑的时候保持 docs/swagger/abc.js
,如果设置了 true,就会重置 :splat
参数.
下面示例验证用户是否已经存在,应用于全部请求:
1 2 3 4 5 6 7 8 | var FilterUser = func (ctx *context.Context) { _, ok := ctx.Input.Session( "uid" ).(int) if !ok && ctx.Request.RequestURI != "/login" { ctx.Redirect(302, "/login" ) } } beego.InsertFilter(<strong> "/*" ,beego.BeforeRouter,FilterUser</strong>) |
这里需要特别注意使用 session 的 Filter 必须在 BeforeStatic 之后才能获取,因为 session 没有在这之前初始化。
还可以通过正则路由进行过滤,如果匹配参数就执行:
1 2 3 4 5 6 7 | var FilterUser = func (ctx *context.Context) { _, ok := ctx.Input.Session( "uid" ).(int) if !ok { ctx.Redirect(302, "/login" ) } } beego.InsertFilter(<strong> "/user/:id([0-9]+)" ,beego.BeforeRouter,FilterUser</strong>) |
过滤器实现路由
beego1.1.2 开始 Context.Input 中增加了 RunController 和 RunMethod, 这样我们就可以在执行路由查找之前,在 filter 中实现自己的路由规则.
如下示例实现了如何实现自己的路由规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var UrlManager = func (ctx *context.Context) { // 数据库读取全部的 url mapping 数据 urlMapping := model.GetUrlMapping() for baseurl,rule:= range urlMapping { if baseurl == ctx.Request.RequestURI { ctx.Input.RunController = rule.controller ctx.Input.RunMethod = rule.method break } } } beego.InsertFilter( "/*" ,beego.BeforeRouter,UrlManager) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2017-12-15 Redis重大版本
2017-12-15 MySQL——存储引擎
2017-12-15 Redis使用场景
2017-12-15 查看一张表的信息