beego支持自定义过滤中间件,例如安全验证、强制跳转等。

过滤器函数如下所示:

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 参数.

下面示例验证用户是否已经存在,应用于全部请求:

var FilterUser = func(ctx *context.Context) {
_, ok := ctx.Input.Session("uid").(int)
if !ok && ctx.Request.RequestURI != "/login" {
ctx.Redirect(302, "/login")
}
} beego.InsertFilter("/*",beego.BeforeRouter,FilterUser)

  

这里需要特别注意使用 session 的 Filter 必须在 BeforeStatic 之后才能获取,因为 session 没有在这之前初始化。

还可以通过正则路由进行过滤,如果匹配参数就执行:

var FilterUser = func(ctx *context.Context) {
_, ok := ctx.Input.Session("uid").(int)
if !ok {
ctx.Redirect(302, "/login")
}
}
beego.InsertFilter("/user/:id([0-9]+)",beego.BeforeRouter,FilterUser)

  

过滤器实现路由

beego1.1.2 开始 Context.Input 中增加了 RunController 和 RunMethod, 这样我们就可以在执行路由查找之前,在 filter 中实现自己的路由规则.

如下示例实现了如何实现自己的路由规则:

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)

  

最新文章

  1. Android 6.0 运行时权限处理完全解析
  2. win7、linux安装使用pip、mitmproxy
  3. Ubuntu Java Envrioment
  4. redis 学习笔记(4)-HA高可用方案Sentinel配置
  5. TOMOYO Linux(undone)
  6. 添加hive默认配置hiverc
  7. android 退出整个程序
  8. Install GTK in Ubuntu
  9. C语言调用汇编实现字符串对换
  10. oracle for update和for update nowait
  11. ViewPager切换动画PageTransformer使用
  12. jquery的动画函数animate()讲解一
  13. 载入DLL中的图片资源生成Skia中的SkBitmap对象
  14. hdu 5052 树链剖分
  15. (3)打造简单OS-MBR引导区转移加载简单程序(突破512限制)
  16. 安装Drush工具 -Centos
  17. 20165305 苏振龙《Java程序设计》第八周课上测试补做
  18. day24类的继承
  19. beta冲刺————第二天(2/5)
  20. kafka-2.11-0.11集群搭建

热门文章

  1. esp8266必备知识
  2. 使用code::blocks搭建objective-c的IDE开发环境 支持 @interface
  3. 8237dma的四种传送方式简介
  4. 简单的SpringCloud 熔断Hystrix
  5. Class.forName(String className)这个方法的作用
  6. 该如何将MathType公式粘贴到文档中
  7. CSV转PDF(C++)
  8. 利用python输出000至999中间的数
  9. java的poi导入excel时解析日期
  10. jpa单向一对多关联映射