路由组中间件题目描述创建一个/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) }全局中间件题目描述写一个中间件拦截所有接口请求头带必须携带token和userId两个参数缺少任意一个直接返回错误。输出示例缺少参数{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) }
【Gin】中间件练习题
发布时间:2026/5/19 6:51:52
路由组中间件题目描述创建一个/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) }全局中间件题目描述写一个中间件拦截所有接口请求头带必须携带token和userId两个参数缺少任意一个直接返回错误。输出示例缺少参数{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) }