beego 是一个用于Go编程语言的开源、高性能的 web 框架
beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask
beego 官网:http://beego.gocn.vip/
上面的 beego 官网如果访问不到,看这篇文章《beego 官网文档本地环境搭建》
注意:本文的 beego 文档使用的就是本地环境搭建的文档,因为官网文档已经不可用了
beego 官方 github 仓库:https://github.com/beego/beego
上一讲,讲了 beego 的 web模块中的路由部分,需要的朋友可以查看《Beego 使用教程 3:Web 模块之路由》
这一讲,主要讲解 beego 的 过滤器
笔者使用上一讲的代码
目录
1、基本使用
在项目根目录下新建 filter目录,在 filter目录下新建 filter.go
在 filter目录下 filter.go 中添加下面代码
package filter
import (
"fmt"
"github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/server/web/context"
)
func RegisterFilters() {
web.InsertFilter("/*", web.BeforeExec, func(ctx *context.Context) {
fmt.Println("过滤器: " + ctx.Request.RequestURI)
fmt.Println("过滤: " + ctx.Input.URL())
})
}
/* 过滤所有请求。过滤器类型除了BeforeExec 外,还有BeforeStatic、BeforeRouter、BeforeExec、AfterExec、FinishRouter
main.go 中代码如下
package main
import (
"beego-demo/controller"
"beego-demo/filter"
"fmt"
"github.com/beego/beego/v2/core/config"
"github.com/beego/beego/v2/server/web"
)
func main() {
//通过config获取自定义配置
workername, _ := config.String("workername")
fmt.Println(workername)
//执行定时任务
//go job.DemoTask()
//注册自动路由
//web.AutoPrefix("api", &controller.UserController{})
web.CtrlGet("/name", (*controller.UserController).Name)
web.CtrlGet("/get/:id", (*controller.UserController).GetUserById)
web.CtrlGet("/get/:id/:num", (*controller.UserController).GetUserByIdAndNum)
//注册函数式路由
controller.RegisterFunctionalRoutes()
//web命名空间
controller.RegisterNamespaceRoutes()
//过滤器
filter.RegisterFilters()
//开启 Admin 管理后台
web.BConfig.Listen.EnableAdmin = true
web.BConfig.Listen.AdminAddr = "localhost"
web.BConfig.Listen.AdminPort = 8088
//查看已注册路由
tree := web.PrintTree()
methods := tree["Data"].(web.M)
for k, v := range methods {
fmt.Printf("%s => %v\n", k, v)
}
web.Run()
}
重新启动,浏览器访问:http://localhost:9090/book
运行效果

2、过滤器链
filter.go 修改为下面代码
package filter
import (
"fmt"
"github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/server/web/context"
)
func RegisterFilters() {
web.InsertFilter("/*", web.BeforeExec, func(ctx *context.Context) {
fmt.Println("过滤器: " + ctx.Request.RequestURI)
fmt.Println("过滤: " + ctx.Input.URL())
})
web.InsertFilterChain("/*", func(next web.FilterFunc) web.FilterFunc {
return func(ctx *context.Context) {
fmt.Println("过滤器链")
next(ctx)
}
})
}
重新启动
运行效果

3、内置过滤器
beego 提供了很多内置过滤器,如请求验证过滤器、限流过滤器等等,这些过滤器内在逻辑 beego已经实现完了,我们想用的话直接添加即可
3.1、身份认证过滤器
下面介绍身份认证过滤器
filter.go 修改为下面代码
package filter
import (
"fmt"
"github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/server/web/context"
"github.com/beego/beego/v2/server/web/filter/auth"
)
func RegisterFilters() {
web.InsertFilter("/*", web.BeforeExec, func(ctx *context.Context) {
fmt.Println("过滤器: " + ctx.Request.RequestURI)
fmt.Println("过滤: " + ctx.Input.URL())
})
web.InsertFilterChain("/*", func(next web.FilterFunc) web.FilterFunc {
return func(ctx *context.Context) {
fmt.Println("过滤器链")
next(ctx)
}
})
web.InsertFilter("/*", web.BeforeRouter, auth.Basic("myname", "mypassword"))
}
这里请求需要构造 auth,因此笔者使用 postman 构建请求
先测试浏览器普通的请求,会提示输入用户名密码

只有输入流用户名密码才能请求成功

3.2、限流过滤器
下面介绍内置的限流过滤器
filter.go 修改为下面代码
package filter
import (
"fmt"
"github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/server/web/context"
"github.com/beego/beego/v2/server/web/filter/ratelimit"
"time"
)
func RegisterFilters() {
web.InsertFilter("/*", web.BeforeExec, func(ctx *context.Context) {
fmt.Println("过滤器: " + ctx.Request.RequestURI)
fmt.Println("过滤: " + ctx.Input.URL())
})
web.InsertFilterChain("/*", func(next web.FilterFunc) web.FilterFunc {
return func(ctx *context.Context) {
fmt.Println("过滤器链")
next(ctx)
}
})
//web.InsertFilter("/*", web.BeforeRouter, auth.Basic("myname", "mypassword"))
//自带限流过滤器 每秒钟2个请求
web.InsertFilter("/*", web.BeforeRouter, ratelimit.NewLimiter(ratelimit.WithCapacity(2), ratelimit.WithRate(time.Second)))
}
添加限流过滤器,每秒钟2个请求通过
重新启动
运行效果

3.3、CORS 过滤器
CORS Filter 可以实现跨域请求
filter.go 修改为下面代码
package filter
import (
"fmt"
"github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/server/web/context"
"github.com/beego/beego/v2/server/web/filter/cors"
)
func RegisterFilters() {
web.InsertFilter("/*", web.BeforeExec, func(ctx *context.Context) {
fmt.Println("过滤器: " + ctx.Request.RequestURI)
fmt.Println("过滤: " + ctx.Input.URL())
})
web.InsertFilterChain("/*", func(next web.FilterFunc) web.FilterFunc {
return func(ctx *context.Context) {
fmt.Println("过滤器链")
next(ctx)
}
})
web.InsertFilter("/*", web.BeforeRouter, cors.Allow(&cors.Options{
AllowAllOrigins: true,
}))
//web.InsertFilter("/*", web.BeforeRouter, auth.Basic("myname", "mypassword"))
//自带限流过滤器 每秒钟2个请求
//web.InsertFilter("/*", web.BeforeRouter, ratelimit.NewLimiter(ratelimit.WithCapacity(2), ratelimit.WithRate(time.Second)))
}
写一个html 页面,用来测试跨域请求,html 页面代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<h1>测试 CORS Filter</h1>
<script>
$.ajax({
url:'http://localhost:9090/book',
success(res) {
alert(res)
}
})
</script>
</body>
</html>
运行效果
先注释掉 CORS Filter 测试跨域不通过情况

再打开 CORS Filter 测试跨域通过情况

更多过滤器先关内容,请参考 beego 文档
至此完
本文详细介绍了Go语言中的Beego框架过滤器的使用,包括基本使用方法、过滤器链的创建以及内置的身份证认证、限流和CORS过滤器的实践。通过示例代码展示了如何设置和应用过滤器,帮助开发者更好地理解和应用Beego框架的过滤功能。
1万+

被折叠的 条评论
为什么被折叠?



