gin 中间件流程控制
Next()
源码注释:Next
应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。
通俗的说,就是中间件放行,当一个中间件代码执行到Next()
,会先执行它之后的函数,最后再来执行完本函数。
eg:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func m1(c *gin.Context) {
fmt.Println("m1 in......")
c.Next()
fmt.Println("m1 out......")
}
func indexHandler(c *gin.Context) {
fmt.Println("index....in")
c.JSON(http.StatusOK, gin.H{"msg": "index"})
c.Next()
fmt.Println("index....out")
}
func m2(c *gin.Context) {
fmt.Println("m2 in......")
c.Next()
fmt.Println("m2 out.....")
}
func main() {
router := gin.Default()
router.GET("/", m1, indexHandler, m2)
router.Run(":8080")
}
//输出
/*
m1 in......
index....in
m2 in......
m2 out.....
index....out
m1 out.....
*/.
如果其中一个中间件响应了c.Abort(),后续中间件将不再执行,直接按照顺序走完所有的响应中间件
Abort
源码注释:Abort
防止调用挂起的处理程序。注意,这不会停止当前处理程序。
假设您有一个授权中间件,用于验证当前请求是否已授权。
如果授权失败(例如:密码不匹配),调用Abort
以确保不调用此请求的其余处理程序。
意思就是当程序执行到Abort()
时,后续的 Handler Func
就不会执行了
eg:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func m1(c *gin.Context) {
fmt.Println("m1 in......")
c.JSON(http.StatusOK, gin.H{"msg": "第一个中间件拦截了"})
c.Abort()
}
func indexHandler(c *gin.Context) {
fmt.Println("index....")
c.JSON(http.StatusOK, gin.H{"msg": "index"})
}
func m2(c *gin.Context) {
fmt.Println("m2 in......")
}
func main() {
router := gin.Default()
router.GET("/", m1, indexHandler, m2)
router.Run(":8080")
}
//输出
//m1 in......