gin中间件
1.gin可以构建中间件,但它只对注册过的路由函数起作用
2.对于分组路由,嵌套使用中间件,可以限定中间件的作用范围
3.中间件分为全局中间件,单个路由中间件和群中间件
4.gin中间件必须是一个gin.HandlerFunc类型

中间件.png
######### 应用
登录、权限
全局中间件
所有请求都经过此中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
// 定义中间件
func MiddleWare()gin.HandlerFunc{
return func(c *gin.Context) {
t:=time.Now()
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request","中间件")
// 执行中间件
c.Next()
// 响应
status := c.Writer.Status()
fmt.Println("中间件执行完成",status)
t2:= time.Since(t)
fmt.Println("time:",t2)
}
}
func main() {
// 1. 创建路由器
r := gin.Default()
// 1.注册中间件
r.Use(MiddleWare())
// {}为了代码规范
{
r.GET("/middleware", func(c *gin.Context) {
// 取值
req,_:=c.Get("request")
fmt.Println("request:",req)
// 页面接收
c.JSON(200,gin.H{"request:":req})
})
}
// 3.监听端口,默认8080
r.Run(":8000")
}

结果.png

终端.png
Next()方法
看源码

next.png
遍历了handle
全局中间件和局部中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
// 定义中间件
func MiddleWare()gin.HandlerFunc{
return func(c *gin.Context) {
t:=time.Now()
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request","中间件")
// 执行中间件
c.Next()
// 响应
status := c.Writer.Status()
fmt.Println("中间件执行完成",status)
t2:= time.Since(t)
fmt.Println("time:",t2)
}
}
func main() {
// 1. 创建路由器
r := gin.Default()
// 1.注册中间件
r.Use(MiddleWare())
// {}为了代码规范
{
r.GET("/middleware", func(c *gin.Context) {
// 取值
req,_:=c.Get("request")
fmt.Println("request:",req)
// 页面接收
c.JSON(200,gin.H{"request:":req})
})
// 根据路由后面定义的局部中间件
r.GET("/middleware2", MiddleWare(),func(c *gin.Context) {
// 取值
req,_:=c.Get("request")
fmt.Println("request:",req)
// 页面接收
c.JSON(200,gin.H{"request:":req})
})
}
// 3.监听端口,默认8080
r.Run(":8000")
}