wxvirus wxvirus
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

无解的lifecycle

let today = new Beginning()
首页
  • Go文章

    • Go语言学习
  • Rust

    • Rust学习
  • Java

    • 《Java》
  • Python文章

    • Python
  • PHP文章

    • PHP设计模式
  • 学习笔记

    • 《Git》
  • HTML
  • CSS
  • JS
  • 技术文档
  • GitHub技巧
  • 刷题
  • 博客搭建
  • 算法学习
  • 架构设计
  • 设计模式
  • 学习
  • 面试
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • C&C++

  • PHP

  • Python

  • Go

    • go基础

    • go核心

    • 网络编程

    • gowebsocket

    • gocasbin

    • K8S

    • rabbitmq

    • 框架相关

      • gin中间件
        • gin的中间件使用
          • 一般写法
          • 路由组注册中间件
          • 阻止进入下一个请求
          • gin框架的默认中间件
          • gin中间件中使用goroutine
      • gorm使用和学习
      • micro初探
      • micro微服务模块搭建
      • docker封装自己的micro工具
      • 手撸IOC容器
      • gormv1版连接数据库
      • gin通用响应封装
      • gin自定义验证器和翻译器
    • go-zero

    • kafka

    • rpc

    • 性能相关

  • microservice

  • rust

  • Java

  • 学习笔记

  • 后端
  • Go
  • 框架相关
wxvirus
2021-10-21

gin中间件

# gin的中间件使用

中间件定义

func m1(c *gin.Context) {
	fmt.Printf("m1 in ...")
	start := time.Now()
	c.Next() // 调用后面的
	cost := time.Since(start)
	fmt.Printf("cost: %v\n", cost)
	fmt.Println("m1 out...")
	//c.Abort() // 组织调后续的处理
}
1
2
3
4
5
6
7
8
9

中间件注册

// 全局注册中间件函数 m1
r.Use(m1)
1
2
// 只在某个路由里使用
// 使用中间件
r.GET("/middleware", m1, func(c *gin.Context) {
  c.JSON(http.StatusOK, gin.H{
    "msg": "middleware",
  })
})
1
2
3
4
5
6
7

如果有多个中间件的执行顺序

gin中间件执行顺序

# 一般写法

采用闭包的形式

// 中间件的一般写法
func authMiddleware(doCheck bool) gin.HandlerFunc {
	// 连接数据库
	// 或者一些其他准备工作
	return func(c *gin.Context) {
		// 存放具体的逻辑
		if doCheck {

		} else {
			c.Next()
		}
	}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 路由组注册中间件

方法1:

videoGroup := r.Group("/video", authMiddleware(true))
{
  // /video/index
  videoGroup.GET("/index", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "msg": "/video/index",
    })
  })
  // /video/xxx
  videoGroup.GET("/xxx", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "msg": "/video/xxx",
    })
  })

  // 嵌套路由组
  xx := videoGroup.Group("xx")
  xx.GET("/x1", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "msg": "/video/xx/x1",
    })
  })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

方法2

videoGroup := r.Group("/video")
videoGroup.User(authMiddleware(true))
{
  // /video/index
  videoGroup.GET("/index", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "msg": "/video/index",
    })
  })
  // /video/xxx
  videoGroup.GET("/xxx", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "msg": "/video/xxx",
    })
  })

  // 嵌套路由组
  xx := videoGroup.Group("xx")
  xx.GET("/x1", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
      "msg": "/video/xx/x1",
    })
  })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 阻止进入下一个请求

使用c.Abort() + return

func m1(c *gin.Context) {
	fmt.Printf("m1 in ...")
	start := time.Now()
	c.Next() // 调用后面的
	cost := time.Since(start)
	c.Abort() // 组织调后续的处理
	return    // 下面的就不会执行了
	fmt.Printf("cost: %v\n", cost)
	fmt.Println("m1 out...")
}
1
2
3
4
5
6
7
8
9
10

# gin框架的默认中间件

gin.Default()默认使用了Logger和Recovery中间件

  • Logger中间件将日志写入gin.DefaultWriter,即使配置了GIN_MODE=release。
  • Recovery中间件会recovery任何panic。如果有panic,会写入500响应码。

如果不想使用上面2个默认中间件,可以使用gin.New()创建一个没有任何默认中间件的路由

# gin中间件中使用goroutine

当在中间件或handler中启动新的goroutine时,不能使用原始的上下文c *gin.Context,必须使用其只读副本c.Copy()

编辑 (opens new window)
#middleware
上次更新: 2021/10/21, 20:43:49
交换机
gorm使用和学习

← 交换机 gorm使用和学习→

最近更新
01
vue3配合vite初始化项目的一些配置
07-26
02
网盘系统开发学习
07-24
03
linux多进程
06-19
更多文章>
Theme by Vdoing | Copyright © 2021-2024 wxvirus 苏ICP备2021007210号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式