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
英文地址,請注明出處:http://en.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上復制一下項目路徑(看那個順眼復制…