【Gin】中间件练习题

路由组中间件

题目描述

创建一个 /admin 路由组,给它单独加一个鉴权中间件,其他接口不受影响。

规则:

  • 请求头带 token: admin123 才允许访问
  • 否则返回 401 无权限

输出示例

无 token:

{"code":401,"msg":"无权限访问"}

有 token:

{"msg":"欢迎进入后台管理"}

实现代码

Go 复制代码
package main

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

// admin 路由组鉴权中间件
func AdminAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("token")
		if token != "admin123" {
			c.JSON(401, gin.H{
				"code": 401,
				"msg":  "无权限访问",
			})
			// 终止请求
			c.Abort()
			return
		}
		// 放行
		c.Next()
	}
}

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

	// 公共接口
	r.GET("/", func(c *gin.Context) {
		c.String(200, "公共页面")
	})

	// admin 路由组 + 中间件
	adminGroup := r.Group("/admin")
	adminGroup.Use(AdminAuthMiddleware())
	{
		adminGroup.GET("/dashboard", func(c *gin.Context) {
			c.JSON(200, gin.H{"msg": "欢迎进入后台管理"})
		})
	}

	r.Run(":8080")
}

全局中间件

题目描述

写一个中间件,拦截所有接口 ,请求头带必须携带 tokenuserId 两个参数,缺少任意一个直接返回错误。

输出示例

缺少参数:{"code":400,"msg":"缺少必传参数 token 或 userId"}

正常:接口正常返回

实现代码

Go 复制代码
package main

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

func CheckParamsMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.GetHeader("token")
		userId := c.GetHeader("userId")

		if token == "" || userId == "" {
			c.JSON(400, gin.H{
				"code": 400,
				"msg":  "缺少必传参数 token 或 userId",
			})
			c.Abort()
			return
		}
		c.Next()
	}
}

func main() {
	r := gin.Default()
	r.Use(CheckParamsMiddleware())

	r.GET("/user", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg": "获取用户信息成功"})
	})
	r.Run(":8080")
}

全局请求来源校验中间件

题目描述

编写全局中间件 ,所有接口统一校验,只允许本地 127.0.0.1 访问,其他 IP 直接拒绝访问。

输出示例

非法 IP:{"msg":"禁止外部访问"}

正常访问:接口正常响应

实现代码

Go 复制代码
package main

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

func LocalOnlyMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		ip := c.ClientIP()
		if ip != "127.0.0.1" {
			c.JSON(403, gin.H{"msg":"禁止外部访问"})
			c.Abort()
			return
		}
		c.Next()
	}
}

func main() {
	r := gin.Default()
	r.Use(LocalOnlyMiddleware()) // 全局生效

	r.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg":"访问成功"})
	})
	r.Run(":8080")
}

单个路由参数校验

题目描述

编写中间件,只给 /pay 接口使用,必须传递金额参数 money,且金额大于 0 才可访问,其他接口无限制。

输出示例

无参数 / 金额错误:

{"msg":"请传入合法金额"}

实现代码

Go 复制代码
package main

import (
	"strconv"
	"github.com/gin-gonic/gin"
)

func MoneyCheck() gin.HandlerFunc {
	return func(c *gin.Context) {
		moneyStr := c.Query("money")
		money,err := strconv.Atoi(moneyStr)
		if err != nil || money <= 0 {
			c.JSON(400, gin.H{"msg":"请传入合法金额"})
			c.Abort()
			return
		}
		c.Next()
	}
}

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

	r.GET("/info", func(c *gin.Context) {
		c.JSON(200, gin.H{"msg":"商品信息"})
	})

	// 单个路由绑定专属中间件
	r.GET("/pay", MoneyCheck(), func(c *gin.Context) {
		c.JSON(200, gin.H{"msg":"发起支付成功"})
	})

	r.Run(":8080")
}
相关推荐
先跑起来再说10 小时前
Go 排行榜系统的工程化实现:分布式锁、快照表与定时刷新
分布式·go·gin
必胜刻2 天前
一个异步生成游戏功能的落地复盘:Redis Stream + WebSocket + 状态补偿
redis·websocket·golang·gin·状态补偿
TE-茶叶蛋3 天前
B-tree vs GIN Trigram vs HNSW
gin
曾几何时`5 天前
Go(一)Gin框架 和 GORM机制
开发语言·golang·gin
老毛肚6 天前
Gin + GORM 接口可视化测试
gin
lolo大魔王6 天前
Gin 框架中间件超详细实战教程(原理、全局中间件、路由中间件、自定义中间件、跨域、日志拦截)
中间件·gin
lolo大魔王7 天前
Gin 框架响应格式与 HTML 模板渲染完整实战教程
前端·html·gin
必胜刻15 天前
Go 调用Coze工作流实现 AI 游戏生成
开发语言·ai·golang·gin
比特森林探险记17 天前
context 在 gRPC / Gin / K8s 中的实战
容器·kubernetes·gin
GoFly开发者18 天前
好消息!Gin+GORM-Gen开发框架已集成完成,正在进行测试和编写使用文档中,需要的开发朋友可以等待使用及订阅哦
gin·gorm·gorm-gen