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.pswp.cn/pingmian/87522.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AGV 无人叉车关键技术问题解析:精准定位算法 / 安全避障逻辑 / 系统对接协议全方案

AGV无人叉车作为智能物流的核心装备,在落地时常面临定位漂移、系统兼容性差、避障失灵等痛点。本文深度解析5大高频问题成因与解决方案,助企业规避运营风险,提升效率。 一、定位导航问题:行驶路径偏移怎么办? 1.典型…

AI Agent意图识别

意图识别:多维度拆解 意图识别是人机对话系统(Conversational AI)的“大脑皮层”,负责理解用户言语背后的真实目的。它将用户的自然语言输入映射到一个预定义的意图类别上。可以说,意图识别的准确性,直接决…

.net 8 项目 一天快速入门

这里有一个解决方案 这里有一个接口类的项目 这会呢如果还想在建一个项目 我们在解决方案这里右键,添加,新建项目 点击 我现在要建立一个类库,所以就搜一下类库,这里的第一个就是我们需要创建的类库 起个名字,计算类 进来了 可以看到这里有多了一个项目,但是他们…

语音大模型速览(一)F5-TTS

F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching 论文链接:https://arxiv.org/pdf/2410.06885代码链接:https://SWivid.github.io/F5-TTS/ 一段话总结 本文提出了 F5-TTS,一种基于流匹配和扩散 Transform…

Codeforces 2021 C Those Who Are With Us

[Problem Discription]\color{blue}{\texttt{[Problem Discription]}}[Problem Discription] 给定一个 nmn \times mnm 的表格 ai,ja_{i,j}ai,j​,你可以恰好进行一次如下操作: 选择一个格点 (r,c)(r,c)(r,c)。对于所有满足 iririr 或者 jcjcjc 的格点 (…

chrome插件合集

最近一段时间呢(不到一年),实现了大概二十几个chrome插件。很多人不知道的是,其实开发插件很解压,就好像是我喜欢沿着公园的小路散步一样,每开发一个插件带给我的成就感和快乐都是独特的。我依然记得自己开发出第1个插件时的快乐&…

【机器学习深度学习】模型微调的基本概念与流程

目录 前言 一、什么是模型微调(Fine-tuning)? 二、预训练 vs 微调:什么关系? 三、微调的基本流程(以BERT为例) 1️⃣ 准备数据 2️⃣ 加载预训练模型和分词器 3️⃣ 数据编码与加载 4️…

大语言模型预训练数据——数据采样方法介绍以GPT3为例

大语言模型预训练数据——数据采样方法介绍以GPT3为例一、数据采样核心逻辑二、各列数据含义一、数据采样核心逻辑 这是 GPT - 3 训练时的数据集配置,核心是非等比例采样——不按数据集原始大小分配训练占比,而是人工设定不同数据集在训练中被抽取的概率…

针对同一台电脑,为使用不同 SSH Key 的不同用户分别设置 Git 远程仓库凭据的操作指南

一、准备工作 生成多对 SSH Key 为每个用户(如“个人”、“公司”)生成一对独立的 SSH Key。 示例(在 Git Bash 或 Linux 终端中执行): # 个人 ssh-keygen -t rsa -b 4096 -C "personalexample.com" -f ~/.…

【V5.0 - 视觉篇】AI的“火眼金睛”:用OpenCV量化“第一眼缘”,并用SHAP验证它的“审美”

系列回顾: 在上一篇 《给AI装上“写轮眼”:用SHAP看穿模型决策的每一个细节》 中,我们成功地为AI装上了“透视眼镜”,看穿了它基于数字决策的内心世界。 但一个巨大的问题暴露了:它的世界里,还只有数字。 它…

Open3D 基于最大团(MAC)的点云粗配准

MAC 一、算法原理1、原理概述2、实现流程3、总结二、代码实现三、结果展示博客长期更新,本文最新更新时间为:2025年7月1日。 一、算法原理 1、原理概述 最大团(Maximal Cliques, MAC)法在点云配准中的应用,是近年来解决高离群值(outlier)和低重叠场景下配准问题的重要…

Science Robotics发表 | 20m/s自主飞行+避开2.5mm电线的微型无人机!

从山火搜救到灾后勘察,时间常常意味着生命。分秒必争的任务要求无人机在陌生狭窄环境中既要飞得快、又要飞得稳。香港大学机械工程系张富教授团队在Science Robotics(2025)发表论文“Safety-assured High-speed Navigation for MAVs”提出了微型无人机的安全高速导航…

【数据分析】如何在PyCharm中高效配置和使用SQL

PyCharm 作为 Python 开发者的首选 IDE,其 Professional 版本提供了强大的数据库集成功能,让开发者无需切换工具即可完成数据库操作。本文将手把手教你配置和使用 PyCharm 的 SQL 功能。 一、安装和配置 PyCharm 老生常谈,第一步自然是安装并…

OpenShift AI - 使用 NVIDIA Triton Runtime 运行模型

《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在 OpenShift 4.18 OpenShift AI 2.19 的环境中验证 文章目录 准备 Triton Runtime 环境添加 Triton Serving Runtime运行基于 Triton Runtime 的 Model Server 在 Triton Runtime 中运行模型准备模型运行…

物联网数据安全区块链服务

物联网数据安全区块链服务 下面是一个专为物联网数据安全设计的区块链服务实现,使用Python编写并封装为RESTful API。该服务确保物联网设备数据的不可篡改性、可追溯性和安全性。 import hashlib import json import time from datetime import datetime from uui…

数据集-目标检测系列- 卡车 数据集 truck >> DataBall

数据集-目标检测系列- 卡车 数据集 truck >> DataBall贵在坚持!* 相关项目1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview2)数据集训练、推理相关项目&…

vue/微信小程序/h5 实现react的boundary

ErrorBoundary react的boundary实现核心逻辑无法处理的情况包含函数详细介绍getDerivedStateFromError和componentDidCatch作用为什么分开调用 代码实现(补充其他异常捕捉)函数组件与useErrorBoundary(需自定义Hook) vue的boundar…

Day113 切换Node.js版本、多数据源配置

切换Node.js版本 1.nvm简介nvm(Node Version Manager),在Windows上管理Node.js版本,可以在同一台电脑上轻松管理和切换多个Node.js版本 nvm下载地址:https://github.com/coreybutler/nvm-windows/2.配置nvm安装之后检查nvm是否已经安装好了&a…

应急响应靶机-linux2-知攻善防实验室

题目: 1.提交攻击者IP2.提交攻击者修改的管理员密码(明文)3.提交第一次Webshell的连接URL(http://xxx.xxx.xxx.xx/abcdefg?abcdefg只需要提交abcdefg?abcdefg)4.提交Webshell连接密码5.提交数据包的flag16.提交攻击者使用的后续上传的木马文件名称7.提交攻击者隐藏…

新手前端使用Git(常用命令和规范)

发一篇文章来说一下前端在开发项目的时候常用的一些git命令 注:这篇文章只说最常用的,最下面有全面的 一:从git仓库拉取项目到本地 1:新建文件夹存放项目代码 2:在git上复制一下项目路径(看那个顺眼复制…