在gin
中间件中使用return
方式是无法终止后续代码的执行的。
需要通过c.Abort()
方法进行终止。
...
func CheckToken() gin.HandlerFunc {
return func(c *gin.Context) {
...
...
//return
c.Abort()
c.Next()
}
}
func main() {
router := gin.New()
router.Use(CheckToken(), gin.Recovery(), gin.Logger())
router.GET("/login", LoginFunc)
router.Run(":8081")
}
个人笔记:
1. 为什么return
阻止不了后续的逻辑运行?
2. **c.Next()
**如何开启下一个执行代码?
3. c.Abort()
如何终止后续代码?
router.Use()
会把相关的中间件函数名(CheckToken(), gin.Recovery(), gin.Logger()
)依次append
到group.Handlers
切片后边,后面的router.GET()
也会把LoginFunc
这个业务函数append
到group.Handlers
后面,先放入的会先开始运行。当我们在CheckToken()
这个中间件中使用return
时,它只会结束这个中间件的函数,不会影响到group.Handlers
切片中函数的索引值Index
,gin
驱动会根据Index
继续执行group.Handlers
中的下一个函数(索引为Index+1
)。
中间件函数中的c.Next()
方法会让待执行的函数开始执行的实现方式为:c.Next()
会执行Index++
,当Index
值还在group.Handlers
的长度内,gin
驱动便调用group.Handlers
中的索引为Index
的待执行的函数。
c.Abort()
终止后续逻辑代码的实现方式为:对Index
赋值为一个过大的数,使之超过group.Handlers
的长度,使gin
驱动无法调用到。