【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")
}
相关推荐
会编程的土豆1 天前
Gin 核心概念速记
数据库·后端·gin·goland
GDAL1 天前
Gin c.HTML 完整教程
html·gin
会编程的土豆1 天前
Gin 核心概念 & 前后端交互笔记
笔记·交互·gin
会编程的土豆1 天前
Gin 中 `c.BindJSON` 与 `c.JSON` 详细讲解
c语言·json·gin
会编程的土豆1 天前
Gin 核心对象:`c *gin.Context` 详细解析
服务器·c语言·gin
会编程的土豆1 天前
Gin POST 请求完整流程笔记
chrome·笔记·gin
lolo大魔王3 天前
Go 后端实战|Gin + GORM V2 + MySQL 企业级 API 项目开发(完整版)
mysql·golang·gin
lolo大魔王3 天前
Go 语言 Web 框架 Gin 入门详解
前端·golang·gin
栈溢出了4 天前
GIN学习笔记
人工智能·神经网络·算法·机器学习·gin