【Gin】中间件练习题

📅 2026/7/12 11:23:55 👁️ 阅读次数 📝 编程学习
【Gin】中间件练习题

路由组中间件

题目描述

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

规则:

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

输出示例

无 token:

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

有 token:

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

实现代码

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"}

正常:接口正常返回

实现代码

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":"禁止外部访问"}

正常访问:接口正常响应

实现代码

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":"请传入合法金额"}

实现代码

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") }