4.3. 中间件
简介
中间件提供了一种方便的机制来过滤进入应用程序的 HTTP 请求。
在 gin
框架中验证器、中间件、控制器回调函数本质都是一样的, 都是func(c *gin.Context)
函数, 验证器、中间件 gin-pro
作为流程回调函数通过过滤/验证后会执行c.Next()
继续执行后面的回调函数, 而控制器一般直接定义返回结果 , gin-pro 内置一个允许通过跨域的中间件app/Http/Middleware/cors/cors.go
,根据配置文件在路由加载时自动使用
中间件定义
中间件定义一般在app/Http/Middleware
文件夹下, 根据自己业务常见自行分组
cors中间件示例:
package cors
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Next() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Headers", "Access-Control-Allow-Headers,Authorization,User-Agent, Keep-Alive, Content-Type, X-Requested-With,X-CSRF-Token,AccessToken,Token")
c.Header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, PATCH, OPTIONS")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true")
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusAccepted)
}
c.Next()
}
}
使用中间件
只需要在路由中链式添加Use
方法, 参数添加自定义的中间件函数
注意:
Use
函数只是注册中间件到[]HandlerFunc,并没有立即执行[具体执行时间和注册数量参考 gin源码], 所以中间件与验证器本质上都是执行过滤的函数, 所以gin-pro
验证器也使用Use
方法注册
package open
import (
"gin-pro/app/http/controllers/open"
"gin-pro/app/http/middleware/cors"
"github.com/gin-gonic/gin"
)
func LoadDemoRouter(e *gin.Engine) {
d := e.Group("/open/demo").Use(cors.Next())
{
d.GET("/index", open.NewDemoController().Index)
}
}
推荐文章: