gin 中间件流程控制:Next()、 Abort()
中间件:将这些非业务逻辑代码抽象出来,封装好,提供接口给控制器使用。用到了装饰器模式:将最核心的代码一层层装饰,返回的时候一层层出来。
Next()
源码注释:应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。
通俗的说,就是中间件放行,当一个中间件代码执行到Next(),会先执行它之后的函数,最后再来执行完本函数。
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.....
*/
注意:如果有多层中间件,每层都包含了Next(),其实和洋葱一样,最开始执行的是最外面的一层,后执行的是最里面的一层,但是业务代码执行完了之后,是从最里面这层开始。
Abort
源码注释:防止调用挂起的处理程序。注意,这不会停止当前处理程序。
该方法会阻止业务逻辑以及该中间件后面的中间件执行,但不会阻止该中间件后面的逻辑执行包括c.Next()
假设有一个授权中间件,用于验证当前请求是否已授权。
如果授权失败(例如:密码不匹配),调用Abort以确保不调用此请求的其余处理程序。
意思就是当程序执行到Abort()时,后续的 Handler Func就不会执行了
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......
总结:
1)Next()
该方法会跳过当前中间件后续的逻辑,类似defer,最后再执行c.Next后面的逻辑
多个c.Next()谁在前面谁后执行,跟defer很像,类似先进后出的栈
2)Abort()
该方法会阻止业务逻辑以及该中间件后面的中间件执行,但不会阻止该中间件后面的逻辑执行包括c.Next()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」