gin框架使用系列之六——自定义中间件

一、gin中间件概述

gin中将很多需要拓展的功能都归纳到中间件中,比如说上篇我们用到的国际化的转换器,就是一个中间件。在大多数情况下,中间件可以理解为一个拦截器,gin中将中间件组成一个链,在调用的过程中依次执行中间件,就可以实现拦截的目的。

gin中的中间件实现其实很简单,其实就是一个func(*Context)的函数类型,并在使用的时候在router.use()中注入即可。尤其是因为有routeGroup功能,gin还可以支持给不同的group添加不同的中间件

在中间件中,调用c.Next()方法可以让直行链继续,调用c.Abort()方法阻断链的继续执行

注意:在gin的中间件中,直接return不能阻断链条的执行,必须调用c.Abort()方法才行

二、自定义token校验中间件示例

我们自定一个token校验的中间件,来掩饰中间件的使用方法

自定义中间件的核心代码如下:

go 复制代码
func checkToken(c *gin.Context) {
	var token string
	// 找到token数据
	for key, value := range c.Request.Header {
		if strings.ToLower(key) == "x-token" {
			token = value[0]
		}
	}
	// 校验token
	if token != "hong" {
		c.JSON(http.StatusBadRequest, gin.H{
			"msg": "token错误",
		})
		c.Abort()
	}
	c.Next()
}

整体示例代码如下:

go 复制代码
package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

func checkToken(c *gin.Context) {
	var token string
	// 找到token数据
	for key, value := range c.Request.Header {
		if strings.ToLower(key) == "x-token" {
			token = value[0]
		}
	}
	// 校验token
	if token != "hong" {
		c.JSON(http.StatusBadRequest, gin.H{
			"msg": "token错误",
		})
		c.Abort()
	}
	c.Next()
}

func main() {
	router := gin.Default()
	// 添加token校验的中间件
	router.Use(checkToken)
	router.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	router.Run() // listen and serve on 0.0.0.0:8080
}

运行程序,添加错误token的访问结果


添加正确token的访问结果

后记

个人总结,欢迎转载、评论、批评指正

相关推荐
程序员爱钓鱼5 小时前
Go语言实战案例-项目实战篇:新闻聚合工具
后端·google·go
影灵衣丶1 天前
Go 1.25 实战解读:绿茶 GC 与容器核心数感知(工程影响与落地)
后端·go
一直_在路上1 天前
突发高流量应对之道:Go语言限流、熔断、降级三板斧
面试·go
程序员爱钓鱼1 天前
Go语言100个实战案例-项目实战篇:股票行情数据爬虫
后端·go·trae
程序员爱钓鱼2 天前
Go语言实战案例 — 项目实战篇:简易博客系统(支持评论)
前端·后端·go
郭京京3 天前
go框架gin(中)
后端·go
郭京京3 天前
go框架gin(下)
后端·go
一直_在路上3 天前
Go 语言微服务演进路径:从小型项目到企业级架构
架构·go
程序员爱钓鱼3 天前
Go语言实战案例 — 项目实战篇:任务待办清单 Web 应用
后端·google·go
lypzcgf4 天前
Coze源码分析-资源库-创建知识库-后端源码-应用/领域/数据访问
后端·go·coze·coze源码分析·智能体平台·ai应用平台·agent平台