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

gin框架 中间件 是在判断路由存在前执行还是存在后执行的研究

最近有个需求,就是发现我们的验签路由中间件会在判断路由是否存在前执行。我们期望是gin框架先自己判断路由中间件是否存在,存在了再走后面的中间件,不存在直接返回404.这样能节省一定的资源。
研究了一下gin框架的源码,
先说一下表面的研究。
在这里插入图片描述

当我用r.Use的方式直接注册路由的时候,会是先走验证中间件后走找路由。
当我先group再用group 去注册路由的时候,就会是先找路由再走验证中间件。
然后研究gin的use源码。
这个是gin.Default的use源码

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {engine.RouterGroup.Use(middleware...)engine.rebuild404Handlers()engine.rebuild405Handlers()return engine
}

这个是group的use源码

// Use adds middleware to the group, see example code in GitHub.
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {group.Handlers = append(group.Handlers, middleware...)return group.returnObj()
}

可以看到gin.Default的use里面其实是直接调用了group的use,然后走了rebuild404Handler和rebuild405Handlers 方法。然后从函数名上就可以看出应该是rebuild404Handler 重置了判断路由是否存在的流程运行位置。
下面是

func (engine *Engine) rebuild404Handlers() {engine.allNoRoute = engine.combineHandlers(engine.noRoute)
}

然后combineHandlers

func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain {finalSize := len(group.Handlers) + len(handlers)if finalSize >= int(abortIndex) {panic("too many handlers")}mergedHandlers := make(HandlersChain, finalSize)copy(mergedHandlers, group.Handlers)copy(mergedHandlers[len(group.Handlers):], handlers)return mergedHandlers
}

从combineHandlers 里面的代码可以看出不来,这里其实做了一个操作就是将将原来的allNoRoute 给替换掉了。新的allNoRoute 是将当前的handle组和engine.noRoute 合并起来的一个新allNoRoute 。
所以只要你是直接使用r.Use()那么你注册的路由中间件都是在路由查询之前跑的。改也很简单,要么设置路由组,要么使用r.RouterGroup.Use()来注册路由。

http://www.xdnf.cn/news/14776.html

相关文章:

  • 机器学习:集成学习方法之随机森林(Random Forest)
  • 【Unity】MiniGame编辑器小游戏(九)打砖块【Breakout】
  • 【前端】基础 - HTML基础标签和样式设置
  • 【新手小白的嵌入式学习之路】-STM32的学习_GPIO 8种模式学习心得
  • 第二章AIGC入门:打开人工智能生成内容的新世界大门(3/36)
  • Windows连接L2TP/IPsec 协议 VPN失败
  • QT异步操作
  • Kuikly 与 Flutter 的全面对比分析,结合技术架构、性能、开发体验等核心维度
  • QT初识-实现Hello World(2)
  • Qt Quick 与 QML(五)qml中的布局
  • 运维打铁: 数据加密与备份恢复策略制定
  • 免费版安全性缩水?ToDesk、TeamViewer、向日葵、网易UU远程访问隐私防护测评
  • 【卡尔曼滤波第一期】α−β−γ 滤波器概述
  • [CS创世SD NAND征文] 精准控制的坚固基石:CS创世SD NAND在华大HC32F4A0运动控制卡中的高可靠应用
  • 如何在Excel中每隔几行取一行
  • Foundation 5 安装使用教程
  • 【仿muduo库实现并发服务器】Poller模块
  • Python应用指南:利用高德地图API获取公交+地铁可达圈(二)
  • UE5.6 官方文档笔记 [1]——虚幻编辑器界面
  • Qt_Creator入门基础知识
  • BFD故障检测技术之概述
  • 2025 推理技术风向标:DeepSeek-R1 揭示大模型从 “记忆” 到 “思考” 的进化路径
  • k8s将service的IP对应的不同端口分配到不同的pod上
  • day48
  • 【仿muduo库实现并发服务器】Connection模块
  • 630,百度文心大模型4.5系列开源!真香
  • mac python3.13 selenium安装使用
  • 半无界波动方程混合条件求解
  • 王道链表大题算法(部分)
  • 【记录】Word|Word创建自动编号的多级列表标题样式