GF
提供了优雅的中间件请求控制方式,该方式也是主流的 WebServer
提供的请求流程控制方式,基于中间件设计可以为 WebServer
提供更灵活强大的插件机制。经典的中间件洋葱模型:
中间件定义
中间件的定义和普通HTTP执行方法 HandlerFunc
一样,但是可以在 Request
参数中使用 Middleware
属性对象来控制请求流程。
我们拿一个跨域请求的中间件定义来示例说明一下:
func MiddlewareCORS(r *ghttp.Request) {
r.Response.CORSDefault()
r.Middleware.Next()
}
可以看到在该中间件中执行完成跨域请求处理的逻辑后,使用 r.Middleware.Next()
方法进一步执行下一个流程;如果这个时候直接退出不调用 r.Middleware.Next()
方法的话,将会退出后续的执行流程(例如可以用于请求的鉴权处理)。
中间件类型
中间件的类型分为两种:前置中间件和后置中间件。前置即在路由服务函数调用之前调用,后置即在其后调用。
前置中间件
其定义类似于:
func Middleware(r *ghttp.Request) {
// 中间件处理逻辑
r.Middleware.Next()
}
后置中间件
其定义类似于:
func Middleware(r *ghttp.Request) {
r.Middleware.Next()
// 中间件处理逻辑
}
中间件注册
中间件的注册有多种方式,参考接口文档: https://godoc.org/github.com/gogf/gf/net/ghttp
全局中间件
// 通过Server对象绑定
func (s *Server) BindMiddleware(pattern string, handlers ...HandlerFunc)
func (s *Server) BindMiddlewareDefault(handlers ...HandlerFunc)
// BindMiddlewareDefault 别名
func (s *Server) Use(handlers ...HandlerFunc)
// 通过Domain对象绑定
func (d *Domain) BindMiddleware(pattern string, handlers ...HandlerFunc)
func (d *Domain) BindMiddlewareDefault(handlers ...HandlerFunc)
// BindMiddlewareDefault 别名
func (d *Domain) Use(handlers ...HandlerFunc)
全局中间件是可以 独立使用 的请求拦截方法,通过路由规则的方式进行注册,绑定到 Server
/ Domain
上,由于中间件需要执行请求拦截操作,因此往往是使用"模糊匹配"或者"命名匹配"规则。 其中:
BindMiddleware
方法是将中间件注册到指定的路由规则下,中间件参数可以给定多个。BindMiddlewareDefault
方法是将中间件注册到/*
全局路由规则下。Use
方法是BindMiddlewareDefault
别名。
全局中间件仅对动态请求拦截有效,无法拦截静态文件请求。