当前位置: 首页 > news >正文

【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") }
http://www.jsqmd.com/news/843327/

相关文章:

  • Arm Compiler 6.21嵌入式开发工具链解析
  • 【自用】Kicad 导入嘉立创元器件封装(NLBN插件)
  • python 创建虚拟环境,使用虚拟环境,退出虚拟环境
  • 基于树莓派A+与3.5寸PiTFT打造便携式触摸屏设备全攻略
  • STM32F405时钟树配置避坑指南:从HSE到APB,手把手教你算对每个外设时钟
  • 5分钟快速上手:AMD Ryzen处理器专业级调试工具SMUDebugTool完全指南
  • HYCONTROL MICROFLEX-DB超声波液位计实操详解(参数+工况+故障排查)
  • 吕欣团队《大数据平台架构》第四章读书笔记:HDFS——把一块硬盘“拆”成一整个数据中心
  • 从“能用”到“好用”:手把手教你用Simulink Mask功能设计带约束的专业级模块
  • 异突触可塑性:生物大脑中的梯度学习机制与AI启示
  • 片上变压器增益增强技术:原理、架构与毫米波IC设计实践
  • Eviews面板数据回归实战:手把手教你用Hausman检验搞定固定效应与随机效应模型选择
  • NotebookLM提示工程在能源政策分析中的致命误区(附12个经NREL验证的Prompt模板)
  • AI能和你一起打游戏了:Agora-1这个多智能体世界模型有点东西
  • Hermes Agent 完全安装指南(macOS)
  • 南通电缆回收领域翘楚榜单揭晓:专业回收,服务至上
  • Spark算子分类与特性解析
  • 从相似贴子到智能客服:LangChain4j + Milvus 混合检索实战指南
  • 金融涉外业务赋能,守护跨境金融安全
  • 西部数据与希捷财报解读:HDD市场寒冬与存储技术趋势分析
  • 英语阅读_the river burst its banks
  • LinkSwift:终极免费网盘直链下载助手完整使用指南
  • 数据库三四单元的知识总结
  • 激光雷达仿真:禾赛与NVIDIA联手,如何用数字孪生重塑自动驾驶研发?
  • ARM MHU寄存器访问机制与性能优化解析
  • 7B秒杀70B!大模型微调秘籍全解:从理论到实战,玩转高效适配!
  • CCS里已有工程复制到工作空间里
  • OpenCode + OpenSpec 实战指南:从“凭感觉编码”到“规范驱动开发”
  • CentOS 7 虚拟机联网与 yum 源配置笔记
  • SkyWalking 链路追踪实战:从零搭建微服务可观测性体系