golang中web框架-拦截器

842 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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")
    }
}