Skip to content
On this page

中间件

  • gin中间件和Koa的中间件思想一致,都是洋葱模型

  • 使用ctx.Next方法表示调用下一个中间件

  • 使用ctx.Abort方法表示阻断当前中间件之后的其他中间件执行

单个路由中间件

Go
package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
)

func user1(ctx *gin.Context) {
	fmt.Println("进入user1")
	ctx.Next()
	fmt.Println("退出user1")
}

func user2(ctx *gin.Context) {
	fmt.Println("进入user2")
	ctx.Next()
	fmt.Println("退出user2")
}

func user(ctx *gin.Context) {
	fmt.Println("进入user")
	ctx.Next()
	fmt.Println("退出user")
}


func main() {
	router := gin.Default()
	// 单个路由中间件
	router.GET("/user", user1, user2, user)
	router.Run(":9100")
}

访问/user结果如下

Go
进入user1
进入user2
进入user
退出user
退出user2
退出user1

阻断中间件继续执行

  • 使用ctx.Abort方法`
Go
package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
)

func user1(ctx *gin.Context) {
	fmt.Println("进入user1")
	ctx.Next()
	fmt.Println("退出user1")
}

func user2(ctx *gin.Context) {
	fmt.Println("进入user2")
	ctx.Abort()
	fmt.Println("退出user2")
}

func user(ctx *gin.Context) {
	fmt.Println("进入user")
	ctx.Next()
	fmt.Println("退出user")
}


func main() {
	router := gin.Default()

	// 单个路由中间件
	router.GET("/user", user1, user2, user)
	router.Run(":9100")
}

访问/user结果如下

Go
进入user1
进入user2
退出user2
退出user1

全局中间件

  • 使用router.User注册全局中间件
Go
func globalMiddleware(ctx *gin.Context) {
	fmt.Println("进入globalMiddleware")
	ctx.Next()
	fmt.Println("退出globalMiddleware")	
}

func userHanlder(ctx *gin.Context) {
	fmt.Println("userHanlder")
}
func articleHanlder(ctx *gin.Context) {
	fmt.Println("articleHanlder")
}

func main() {
	router := gin.Default()

	router.Use(globalMiddleware)
	// 单个路由中间件
	// router.GET("/user", user1, user2, user)
	router.GET("/user", userHanlder)
	router.GET("/article", articleHanlder)
	router.Run(":9100")
}

访问/user/article

Go
进入globalMiddleware
userHanlder
退出globalMiddleware

进入globalMiddleware
articleHanlder
退出globalMiddleware

分组路由中间件

Go
func globalMiddleware(ctx *gin.Context) {
	fmt.Println("进入globalMiddleware")
	ctx.Next()
	fmt.Println("退出globalMiddleware")	
}

func v1Middleware(ctx *gin.Context) {
	fmt.Println("进入v1Middleware")
	ctx.Next()
	fmt.Println("退出v1Middleware")	
}

func tagsHanlder(ctx *gin.Context) {
	fmt.Println("tagsHanlder")
}

func main() {
	router := gin.Default()
	router.Use(globalMiddleware)
	v1Gorup := router.Group("/v1")
	// 注册v1中间件
	v1Gorup.Use(v1Middleware)
	{
		v1Gorup.GET("/tags", tagsHanlder)
	}
	v2Gorup := router.Group("/v2")
	{
		v2Gorup.GET("/tags", tagsHanlder)
	}
	router.Run(":9100")
}

访问/v1/tags打印如下

Go
进入globalMiddleware
进入v1Middleware
tagsHanlder
退出v1Middleware
退出globalMiddleware

访问/v2/tags打印如下

Go
进入globalMiddleware
tagsHanlder
退出globalMiddleware