小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
beego中的拦截器
我们熟知的Java里的拦截器是动态拦截controller调用的对象,它提供了一种机制使开发者可以定义在一个controller执行的前后执行的代码,也可以在一个controller执行前阻止其执行,同时也提供了一种可以提取controller中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
beego中使用过滤器:
beego.InsertFilter(pattern string, position int, filter FilterFunc, params ...bool)
- 第一个参数表示过滤的路由规则,支持通配符
- 第二个参数就是过滤器的位置,beego支持的有5种
- BeforeStatic 静态地址之前
- BeforeRouter 寻找路由之前
- BeforeExec 找到路由之后,开始执行相应的 Controller 之前
- AfterExec 执行完 Controller 逻辑之后执行的过滤器
- FinishRouter 执行完逻辑之后执行的过滤器
- 第三个参数为执行的函数
- func(*context.Context) 参数必须是context.Context
- 第四个参数
- 第一个设置 returnOnOutput 的值,默认 true。即如果有输出是否跳过其他过滤器,默认只要有输出就不再执行其他过滤器,即执行完controller之后不会执行后面的过滤器
- 第二个表示是否重置过滤器的参数,默认是 false
注意:使用 session 的 Filter 必须在 BeforeStatic 之后才能获取,因为 session 没有在这之前初始化。
示例:
func main() {
// 过滤器
beego.InsertFilter("/*", beego.BeforeRouter, controllers.FilterUser,true,false)
beego.Run()
}
// 如果session中没有uid则跳转到登陆页面
var FilterUser = func(ctx *context.Context) {
if ctx.Request.RequestURI != "/login" { // 如果请求的url不是login,则重定向到login路径
ctx.Redirect(302, "/login")
}
}