转载

gin框架 中间件 Abort()

gin 框架中间件处理有两个重要的函数 Next() 和 Abort()。
Abort 函数在被调用的函数中阻止后续中间件的执行。例如,你有一个验证当前的请求是否是认证过的 Authorization 中间件。如果验证失败(例如,密码不匹配),调用 Abort 以确保这个请求的其他函数不会被调用。
有个细节需要注意,调用 Abort 函数不会停止当前的函数的执行,除非后面跟着 return。

1. gin 中间件 Abort() 的定义

gin 中间件 Abort() 使用方法如下:

  1. func (c *Context)Abort()

比如:

  1. func MiddleWare() gin.HandlerFunc { return func(c *gin.Context) { c.Abort() } }

2. gin 中间件 Abort() 的范例

我们的案例中共有三个中间件,其中在中间件1中,调用了 Abort 函数。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. )
  6. // 定义中间件1
  7. func MiddleWare1() gin.HandlerFunc {
  8. return func(c *gin.Context) {
  9. fmt.Println("调用中间件1")
  10. // 调用 Abort,终止执行后续的中间件
  11. c.Abort()
  12. }
  13. }
  14. // 定义中间件2
  15. func MiddleWare2() gin.HandlerFunc {
  16. return func(c *gin.Context) {
  17. fmt.Println("调用中间件2")
  18. }
  19. }
  20. // 定义中间件3
  21. func MiddleWare3() gin.HandlerFunc {
  22. return func(c *gin.Context) {
  23. fmt.Println("调用中间件3")
  24. }
  25. }
  26. func main() {
  27. // 创建路由
  28. engine := gin.Default()
  29. // 注册中间件
  30. engine.Use(MiddleWare1(), MiddleWare2(), MiddleWare3())
  31. // 路由规则
  32. engine.GET("/", func(c *gin.Context) {
  33. fmt.Println("调用路由处理函数")
  34. // 页面接收
  35. c.JSON(200, gin.H{"request": "编程宝库 gin框架"})
  36. })
  37. engine.Run()
  38. }

运行程序,并在浏览器输入:http://localhost:8080,控制台日志会输出:

  1. [GIN-debug] GET / --> main.main.func1 (4 handlers)
  2. [GIN-debug] Listening and serving HTTP on :8080
  3. 调用中间件1
  4. [GIN] 2021/05/31 - 12:03:13 | 200 | 193.22µs | ::1 | GET "/"

说明只有中间件1被调用,其余的中间件被取消执行,而且页面处理函数也被取消执行。