中间件中的Next和Abort
一、Next
在我们定义的众多中间件,会形成一条中间件链,而通过 Next 函数来对后面的中间件进行执行
特点:
- 1.当遇到c.Next()函数时 它取出所有的没被执行过的注册的函数都执⾏⼀遍,然后再回到本函数中,有点类似递归函数
- 2.Next 函数是在请求前执行,而 Next 函数后是在请求后执行。
- 3.可以用在token校验,把用户id存起来供给功能性函数使用
二、Abort
- ctx.Abort()方法的作用 终止调用整个链条
- 比如:token认证没有通过,不能直接使用return返回,而是使用Abort来终止
三、中间件执行顺序示例
func MiddleWare1(ctx *gin.Context) {
fmt.Println("这是自定义中间件1--开始")
ctx.Next()
fmt.Println("这是自定义中间件1--结束")
}
func MiddleWare2() gin.HandlerFunc {
return func(ctx *gin.Context) {
fmt.Println("这是自定义中间件2--开始")
if 3 < 4{ // 满足条件
ctx.Abort()
}
ctx.Next()
fmt.Println("这是自定义中间件2--结束")
}
}
func MiddleWare3(ctx *gin.Context) {
fmt.Println("这是自定义中间件3--开始")
ctx.Next()
fmt.Println("这是自定义中间件3--结束")
}
router := gin.Default()
router.Use(Middleware1,Middleware2(),Middleware3)
四、利用Next计算请求时间
func Middle(ctx *gin.Context){
t := time.Now()
//可以设置一些公共参数
c.Set("example", "12345")
//等其他中间件先执行
c.Next()
//获取耗时
latency := time.Since(t)
fmt.Printf("cost time:%d us", latency/1000)
}