【Goland】——Gin 框架中间件详解:从基础到实战

中间件是 Web 应用开发中常见的功能模块,Gin 框架支持自定义和使用内置的中间件,让你在请求到达路由处理函数前进行一系列预处理操作。这篇博客将涵盖中间件的概念、内置中间件的用法、如何编写自定义中间件,以及在实际应用中的一些最佳实践。


文章目录

    • 1. 什么是中间件?
      • 1.1 中间件的概念
      • 1.2 Gin 中的中间件
    • 2. Gin 的内置中间件
      • 2.1 日志中间件 `Logger`
        • 使用方法
      • 2.2 恢复中间件 `Recovery`
        • 示例代码
    • 3. 自定义中间件
      • 3.1 创建一个简单的自定义中间件
      • 3.2 将自定义中间件应用到路由
    • 4. 常见中间件示例
      • 4.1 请求时间记录中间件
      • 4.2 认证中间件
      • 4.3 IP 限制中间件
    • 5. 路由组中的中间件
    • 6. 中间件应用顺序
    • 7. 中间件的实际应用建议
    • 8. 总结

在这里插入图片描述

1. 什么是中间件?

1.1 中间件的概念

中间件是一种拦截 HTTP 请求的处理机制,通常用于在请求到达最终处理函数之前进行操作。通过中间件可以进行认证、日志记录、错误处理等操作,并且可以控制请求是否继续传递给下一个中间件或路由处理函数。

1.2 Gin 中的中间件

在 Gin 框架中,中间件通过 gin.HandlerFunc 类型实现,能够在整个应用或特定的路由组上使用。Gin 默认提供了日志和恢复功能的中间件,用户也可以自定义其他功能的中间件。

2. Gin 的内置中间件

2.1 日志中间件 Logger

Logger 中间件用于记录每个请求的基本信息,包括请求路径、请求方法、请求状态码、响应时间等。这对于监控应用和调试问题非常有用。

使用方法
package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default() // 默认包含 Logger 和 Recovery 中间件// 简单的路由示例r.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})r.Run(":8080")
}

gin.Default() 方法自动包含 Logger 中间件,无需额外配置。每当有请求时,Logger 会在终端中显示请求的详细信息。

2.2 恢复中间件 Recovery

Recovery 中间件用于捕获应用中的 panic 并恢复正常运行状态,避免因为未捕获的异常而导致服务器崩溃。它会将错误信息记录下来并返回 500 状态码。

示例代码
package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default() // 默认包含 Recovery 中间件r.GET("/panic", func(c *gin.Context) {panic("模拟服务器崩溃") // 触发 panic})r.Run(":8080")
}

在这个示例中,如果访问 /panic 路径,服务器会触发 panic,但由于 Recovery 中间件的存在,应用不会崩溃,用户将收到一个 500 错误响应,并且错误信息会被记录到日志中。

3. 自定义中间件

3.1 创建一个简单的自定义中间件

在 Gin 中,自定义中间件可以通过定义一个 gin.HandlerFunc 类型的函数来实现。以下是一个简单的示例,在每次请求前后打印日志信息:

func myMiddleware() gin.HandlerFunc {return func(c *gin.Context) {// 请求前println("请求开始")// 继续到下一个中间件或处理函数c.Next()// 请求后println("请求结束")}
}

3.2 将自定义中间件应用到路由

func main() {r := gin.Default()// 全局应用中间件r.Use(myMiddleware())r.GET("/ping", func(c *gin.Context) {c.String(200, "pong")})r.Run(":8080")
}

当访问 /ping 时,会在请求前后分别打印“请求开始”和“请求结束”,说明中间件在请求处理前后都能执行自定义逻辑。

4. 常见中间件示例

4.1 请求时间记录中间件

此中间件会记录每个请求的处理时间,用于监控慢请求:

func requestTimingMiddleware() gin.HandlerFunc {return func(c *gin.Context) {startTime := time.Now()c.Next() // 继续到下一个中间件或处理函数endTime := time.Now()latency := endTime.Sub(startTime)println("请求处理时间:", latency)}
}

requestTimingMiddleware() 应用到路由后,每个请求的处理时间会在终端打印。

4.2 认证中间件

此中间件用于验证用户是否携带有效的 Authorization 头信息。若未携带或无效,则直接返回 401 错误。

func authMiddleware() gin.HandlerFunc {return func(c *gin.Context) {token := c.GetHeader("Authorization")if token != "Bearer your_secret_token" {c.JSON(401, gin.H{"error": "Unauthorized"})c.Abort() // 停止后续处理return}c.Next()}
}

在需要认证的路由上使用该中间件,确保只有携带正确令牌的请求可以继续。

func main() {r := gin.Default()// 应用认证中间件到特定路由r.GET("/protected", authMiddleware(), func(c *gin.Context) {c.JSON(200, gin.H{"message": "认证通过,欢迎访问!"})})r.Run(":8080")
}

4.3 IP 限制中间件

实现一个简单的 IP 限制中间件,允许或禁止特定 IP 地址访问:

func ipRestrictionMiddleware(allowedIP string) gin.HandlerFunc {return func(c *gin.Context) {clientIP := c.ClientIP()if clientIP != allowedIP {c.JSON(403, gin.H{"error": "Forbidden"})c.Abort() // 停止后续处理return}c.Next()}
}

使用示例:

func main() {r := gin.Default()// 仅允许指定 IP 访问r.GET("/admin", ipRestrictionMiddleware("192.168.1.100"), func(c *gin.Context) {c.JSON(200, gin.H{"message": "欢迎访问管理员页面"})})r.Run(":8080")
}

5. 路由组中的中间件

Gin 允许在路由组中使用中间件,适用于对特定前缀的路由应用同一中间件。例如,我们可以对所有 /admin 路由使用认证中间件:

adminGroup := r.Group("/admin")
adminGroup.Use(authMiddleware())
{adminGroup.GET("/dashboard", func(c *gin.Context) {c.JSON(200, gin.H{"message": "欢迎来到管理员仪表盘"})})adminGroup.GET("/settings", func(c *gin.Context) {c.JSON(200, gin.H{"message": "管理员设置页面"})})
}

所有 /admin 开头的路由都需要通过认证。

6. 中间件应用顺序

在 Gin 中,中间件是按照注册的顺序依次执行的,执行顺序为先前后后。如果中间件 A 注册在 B 之前,那么 A 会在 B 之前执行;如果 c.Abort() 被调用,后续中间件将不会执行。

7. 中间件的实际应用建议

  • 认证中间件:应用到需要认证的路由。
  • 日志中间件:应用到所有路由,用于全局请求记录。
  • 限流和防护中间件:用于防止频繁请求,保护 API 资源。
  • 错误处理中间件:捕获并记录错误,确保应用不会因为异常而崩溃。

8. 总结

通过本篇博客,我们详细介绍了 Gin 中中间件的概念、使用方法,以及如何实现和应用自定义中间件。掌握中间件的使用方法后,你将可以更好地控制请求的处理流程,实现如认证、日志记录、限流等高级功能。在下一篇中,我们将深入探讨 Gin 框架的模板渲染功能,帮助你构建更丰富的 Web 应用界面。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/16849.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 3239. 最少翻转次数使二进制矩阵回文 I

给你一个 m x n 的二进制矩阵 grid 。 如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。 你可以将 grid 中任意格子的值 翻转 ,也就是将格子里的值从 0 变成 1 ,或者从 1 变成 0 。 请你返回 …

【C++笔记】vector使用详解及模拟实现

前言 各位读者朋友们,大家好!上期我们讲了string类的模拟实现,这期我们开启vector的讲解。 一.vector的介绍及使用 1.1 vector的介绍 vector的文档 使用STL的三个境界:能用、明理、能扩展,下面学习vector&#xff…

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中,以建立自己的绘图方法。WizFlow附带了完整的流程图模板,以帮助您入门。…

fpga spi回环

SPI设备间的数据传输之所以又被称为数据交换,是因为 SPI协议规定一个 SPI设备 不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)“或者"接收者 (Receiver)”.在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据(不管主 设备好还是从设备),相当于…

软间隔支持向量机支持向量的情况以及点的各种情况

软间隔支持向量 ​ 这一节我们要回答的问题是?如何判断一个点是软间隔支持向量机中的支持向量,在硬间隔支持向量机中,支持向量只需要满足一个等式: y i ( w T x i b ) − 1 0 y_i(w^Tx_i b) -1 0 yi​(wTxi​b)−10 ​ 在软间…

界面控件DevExpress Blazor UI v24.1新版亮点 - 全新PDF Viewer等组件

DevExpress Blazor UI组件使用了C#为Blazor Server和Blazor WebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生Blazor UI组件(包括Pivot Grid、调度程序、图表、数据编辑器和报表等)。 DevExpress Blazor控件目前已经升级…

defaultdict()语法

一、defaultdict产生的原因: 当我使用普通的字典时,用法一般是dict{},添加元素的只需要dict[element] value即,调用的时候也是如此,dict[element] xxx,但前提是element字典里,如果不在字典里就会报错。 defaultdict的…

[HE phy]

前导码 5G OFDM分为两部分,前导码Legacy preamble和数据data 前导码类型: 其中前导码Legacy preamble分为:Legacy Short Traing (L-STF), L_LTF, L-SIG。 如果数据是HT/VHT/HE,则还有其对应格式的前导码。 各类型作用&#xff…

【matlab】数据类型01-数值型变量(整数、浮点数、复数、二进制和十六进制)

文章目录 一、 整数1.1 整数的最值1.2 大整数1.3 当整数值超过了uint64最大值1.4 和其它类型数值运算 二、 浮点数2.1 双精度和单精度2.2 浮点数的存储2.3 浮点数的最值2.4 浮点数的“四舍五入”2.5 浮点数的算术运算2.6 意外:舍入误差、抵消、淹没和中间转换 三、复…

Tessy学习笔记—requirement(需求)的管理

1:什么是需求 Tessy中的requirement(需求)是,我们还是跟着Tessy官方的文档,继续学习,打开官方自带的工程Is Value In Range Requirement.project。 按照官方自带的操作手册,导入txt类型的需求…

关于10款PDF编辑工具我的使用体验!!!!!

如今,pdf的使用已经见怪不怪。在我们的工作、学习和生活中都已经离不开PDF文档了。那我么,随之而来的问题也就是我们经常需要对PDF文件进行编辑。市面上已经出现了许多PDF编辑软件。下面,我将与大家分享一下这几款PDF编辑器的个人使用经历。 …

unity小:shaderGraph不规则涟漪、波纹效果

实现概述 在本项目中,我们通过结合 Sine、Polar Coordinates 和 Time 节点,实现了动态波纹效果。以下是实现细节: 核心实现 Sine 波形生成: 使用 Sine 节点生成基本的波形。该节点能够创建周期性变化,为波纹效果提供…

针对gitgitee的使用

1.下载git 链接 打开终端,桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…

基于yolov8、yolov5的玉米病害检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

省级生活垃圾无害化处理率面板数据(2004-2022年)

生活垃圾无害化处理率是指经过处理的生活垃圾中,达到无害化标准的垃圾所占的比例。这一指标的提高,意味着城市在垃圾处理方面的能力增强,能够有效减少环境污染,提升居民生活质量,同时也是城市可持续发展的重要保障。 …

NTIRE2024 | 修复一切图像RAIM: Restore All Image Model Challenge报告分析

论文/报告地址:NTIRE 2024 Restore Any Image Model (RAIM) in the Wild Challenge 0、写在前面 马上CVPR2024就要开幕,各大挑战赛的排名和详细报告也都出炉。近期留意到这个名字很屌的赛道,修复一切图像的模型,小米的团队的拿了…

【Visual Studio】设置文件目录

打开属性 输出目录:$(SolutionDir)bin\$(Platform)\$(Cinfiguration)\ 中间目录:$(SolutionDir)bin\intermediates\$(Platform)\$(Cinfiguration)\

基于Java的校园菜鸟驿站管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

Photoshop(PS)——人像磨皮

1.新建一个文件,背景为白色,将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来,选择第一个拷贝图层,选择滤镜---杂色---蒙尘与划痕 3.调整一下数值,大概能够模糊痘印痘坑,点击确定。 4.然后选择拷贝2图层…