Spring MVC 多個攔截器的執行順序

一、流程總覽

該流程圖描述了一個多層攔截器鏈的業務處理流程,核心邏輯為:

  1. 前置攔截:通過 predHandler1predHandler2 逐層校驗請求合法性。
  2. 核心處理:通過校驗后執行核心業務邏輯 handler()
  3. 后置處理與清理:按反向順序執行后置操作,最終完成資源釋放。

二、模塊功能與業務場景
1. 前置攔截模塊
  • predHandler1()
    • 業務作用:執行第一層基礎校驗(如用戶身份驗證、請求合法性檢查)。
    • 邏輯分支
      • **返回 **false:請求非法或校驗失敗,直接終止流程(如用戶未登錄時返回401錯誤)。
      • **返回 **true:進入下一層校驗 predHandler2()
  • predHandler2()
    • 業務作用:執行第二層精細化校驗(如權限校驗、參數合規性驗證)。
    • 邏輯分支
      • **返回 **false:校驗失敗,僅觸發 afterCompletion1()(如記錄失敗日志),流程終止。
      • **返回 **true:進入核心業務處理 handler()

2. 核心業務模塊
  • handler()
    • 業務作用:執行實際業務邏輯(如數據計算、數據庫操作、服務調用)。
    • 觸發條件:所有前置攔截器均通過(predHandler1predHandler2 均返回 true)。

3. 后置處理模塊
  • postHandler2()
    • 業務作用:內層后置操作(如修改響應數據、記錄操作日志)。
    • 執行順序:優先于外層后置操作(postHandler1()),確保依賴資源可用。
  • postHandler1()
    • 業務作用:外層后置操作(如統計請求耗時、格式化最終響應)。

4. 完成清理模塊
  • afterCompletion1()
    • 業務作用:外層資源釋放(如關閉數據庫連接、清理臨時文件)。
    • 觸發條件:只要 predHandler1 返回 true,無論后續流程是否成功,均會執行。
  • afterCompletion2()
    • 業務作用:內層資源釋放(如提交事務、關閉內層連接)。
    • 觸發條件predHandler2 返回 true 且流程執行到 handler() 后。

三、流程分支詳解
分支 1:predHandler1** 返回 **false
  • 路徑predHandler1 → 直接響應
  • 業務意義:基礎校驗失敗,無需后續處理(如用戶未登錄時直接拒絕請求)。
分支 2:predHandler2** 返回 **false
  • 路徑predHandler1 → predHandler2 → afterCompletion1
  • 業務意義:精細化校驗失敗(如用戶無權限),但需釋放外層資源(如記錄失敗日志)。
分支 3:所有攔截通過
  • 路徑predHandler1 → predHandler2 → handler → postHandler2 → postHandler1 → afterCompletion2
  • 業務意義:完整處理請求,按反向順序釋放資源(如先提交事務,再關閉連接)。

四、流程設計的關鍵邏輯
  1. 前置順序正向,后置順序反向
    • 前置鏈:由外到內逐層校驗(predHandler1 → predHandler2),確保基礎條件優先驗證。
    • 后置鏈:由內到外反向執行(postHandler2 → postHandler1),避免依賴資源提前釋放。
  2. 資源釋放的精準性
    • 外層資源(如數據庫連接)在 afterCompletion1 釋放。
    • 內層資源(如事務)在 afterCompletion2 釋放,確保提交事務后再關閉連接。

五、實際應用場景
  1. API 請求校驗鏈
    • predHandler1:驗證 Token 有效性 → predHandler2:校驗用戶角色權限 → handler:返回數據。
    • 若角色權限不足,記錄日志(afterCompletion1)并終止流程。
  2. 事務管理流程
    • predHandler1:打開數據庫連接 → predHandler2:開啟事務 → handler:執行業務 SQL。
    • postHandler2:提交事務 → postHandler1:關閉連接。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77426.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77426.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77426.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

django filter 排除字段

在Django中,當你使用filter查詢集(QuerySet)時,通常你會根據模型的字段來過濾數據。但是,有時你可能想要排除某些特定的字段,而不是過濾這些字段。這里有幾種方法可以實現這一點: 使用exclude方…

ByeCode,AI無代碼開發平臺,拖拽式操作構建應用

ByeCode是什么 ByeCode 是一款先進的 AI 無代碼平臺,旨在幫助企業迅速創建數字名片、網站、小程序、應用程序及內部管理系統,無需繁雜的編碼或開發工作。ByeCode 采用直觀的可視化界面和拖拽式操作,使得非技術用戶能夠輕松上手。同時&#x…

AI日報 - 2025年04月28日

🌟 今日概覽(60秒速覽) ▎🤖 能力進展 | Gemini 2.5 Pro成功挑戰《口袋妖怪紅》8道館;AI推理器具備自我糾錯能力;LLM在游戲、多模態理解、代碼遷移等方面展現新能力。 ▎💼 商業動向 | Google回應DOJ反壟斷案&#xff…

在Java中實現List按自定義順序排序的幾種方案

在Java中實現List按自定義順序排序的幾種方案 在實際開發中&#xff0c;我們經常需要對集合中的對象按照特定字段進行排序。當排序規則不是簡單的字母或數字順序&#xff0c;而是自定義的順序時&#xff0c;我們需要采用特殊的方法。本文將以一個List<Person>按省份特定…

微服務架構在云原生后端的深度融合與實踐路徑

??個人主頁??:一ge科研小菜雞-CSDN博客 ????期待您的關注 ???? 一、引言:后端架構的演變,走向云原生與微服務融合 過去十余年,后端架構經歷了從單體應用(Monolithic)、垂直切分(Modularization)、到微服務(Microservices)的演進,每一次變化都是為了解決…

Python中的Walrus運算符分析

Python中的Walrus運算符&#xff08;:&#xff09;是Python 3.8引入的一個新特性&#xff0c;允許在表達式中同時賦值和返回值。它的核心作用是減少重復計算&#xff0c;提升代碼簡潔性。以下是其適用的典型場景及示例&#xff1a; 1. 在循環中避免重復計算 當循環條件需要多次…

用Node.js施展文檔比對魔法:輕松實現Word文檔差異比較小工具,實現Word差異高亮標注(附完整實戰代碼)

引言&#xff1a;當「找不同」遇上程序員的智慧 你是否經歷過這樣的場景&#xff1f; 法務同事發來合同第8版修改版&#xff0c;卻說不清改了哪里 導師在論文修改稿里標注了十幾處調整&#xff0c;需要逐一核對 團隊協作文檔頻繁更新&#xff0c;版本差異讓人眼花繚亂 傳統…

前端瀏覽器窗口交互完全指南:從基礎操作到高級控制

瀏覽器窗口交互是前端開發中構建復雜Web應用的核心能力&#xff0c;本文深入探討23種關鍵交互技術&#xff0c;涵蓋從傳統API到最新的W3C提案&#xff0c;助您掌握跨窗口、跨標簽頁的完整控制方案。 一、基礎窗口操作體系 1.1 窗口創建與控制 // 新窗口創建&#xff08;現代瀏…

Git和Gitlab的部署和操作

一。GIT的基本操作 1.GIT的操作和查看內容 [rootmaster ~]# yum install git -y [rootmaster ~]# git config --list&#xff1a;查看所有配置 2.GIT倉庫初始化 [rootmaster ~]# mkdir /gittest&#xff1a;創建目錄 [rootmaster ~]# cd /gittest/&#xff1a;進入目錄 [rootm…

Linux中線程池的簡單實現 -- 線程安全的日志模塊,策略模式,線程池的封裝設計,單例模式,餓漢式單例模式,懶漢式單例模式

目錄 1. 對線程池的理解 1.1 基本概念 1.2 工作原理 1.3 線程池的優點 2. 日志與策略模式 2.1 日志認識 2.2 策略模式 2.2.1 策略模式的概念 2.2.2 工作原理 2.2 自定義日志系統的實現 3. 線程池設計 3.1 簡單線程池的設計 3.2 線程安全的單例模式線程池的設計 3…

量子力學:量子通信

量子通信是利用量子力學原理對信息進行編碼、傳輸和處理的新型通信方式&#xff0c;以下是其詳細介紹及業界發展現狀&#xff1a; 基本原理 量子疊加態 &#xff1a;量子系統可以處于多個狀態的疊加&#xff0c;如光子的偏振方向可以同時處于水平和垂直方向的疊加態&#xff…

企業架構之旅(1):TOGAF 基礎入門

大家好&#xff0c;我是沛哥兒。今天我們簡單聊下TOGAF哈。 文章目錄 一、TOGAF 是什么定義與核心定位發展歷程與行業地位與其他架構框架的區別 二、TOGAF 核心價值企業數字化轉型助力業務與 IT 的協同作用降本增效與風險管控 三、TOGAF 基礎術語解析架構域&#xff08;業務、…

CSS 內容超出顯示省略號

CSS 內容超出顯示省略號 文章目錄 CSS 內容超出顯示省略號**1. 單行文本省略&#xff08;常用&#xff09;****2. 多行文本省略&#xff08;如 2 行&#xff09;****3. 對非塊級元素生效****完整示例****注意事項** 在 CSS 中實現內容超出顯示省略號&#xff0c;主要通過控制文…

路由器重分發(OSPF+RIP),RIP充當翻譯官,OSPF充當翻譯官

路由器重分發&#xff08;OSPFRIP&#xff09; 版本 1 RIP充當翻譯官 OSPF路由器只會OSPF語言&#xff1b;RIP路由器充當翻譯官就要會OSPF語言和RIP語言&#xff1b;則在RIP中還需要將OSPF翻譯成RIPOSPF 把RIP路由器當成翻譯官&#xff0c;OSPF路由器就只需要宣告自己的ip&am…

AlexNet網絡搭建

AlexNet網絡模型搭建 環境準備 首先在某個盤符下創建一個文件夾&#xff0c;就叫AlexNet吧&#xff0c;用來存放源代碼。 然后新建一個python文件&#xff0c;就叫plot.py吧&#xff0c;往里面寫入以下代碼&#xff0c;用于下載數據集&#xff1a; # FashionMNIST里面包含了…

【計算機網絡】網絡基礎概念

&#x1f4da; 博主的專欄 &#x1f427; Linux | &#x1f5a5;? C | &#x1f4ca; 數據結構 | &#x1f4a1;C 算法 | &#x1f152; C 語言 | &#x1f310; 計算機網絡 這是博主計算機網絡的第一篇文章&#xff0c;本文由于是基礎概念了解&#xff0c;引用了大…

在Spring Boot項目中實現Word轉PDF并預覽

在Spring Boot項目中實現Word轉PDF并進行前端網頁預覽&#xff0c;你可以使用Apache POI來讀取Word文件&#xff0c;iText或Apache PDFBox來生成PDF文件&#xff0c;然后通過Spring Boot控制器提供文件下載或預覽鏈接。以下是一個示例實現步驟和代碼&#xff1a; 1. 添加依賴 …

圖解 Redis 事務 ACID特性 |源碼解析|EXEC、WATCH、QUEUE

寫在前面 Redis 通過 MULTI、EXEC、WATCH 等命令來實現事務功能。Redis的事務是將多個命令請求打包&#xff0c;然后一次性、按照順序的執行多個命令的機制&#xff0c;并且在事務執行期間&#xff0c;服務器不會中斷事務而該去執行其他客戶端的命令請求。 就像下面這樣&#…

LeetCode --- 446 周賽

題目列表 3522. 執行指令后的得分 3523. 非遞減數組的最大長度 3524. 求出數組的 X 值 I 3525. 求出數組的 X 值 II 一、執行指令后的得分 照著題目要求進行模擬即可&#xff0c;代碼如下 // C class Solution { public:long long calculateScore(vector<string>&…

山東大學軟件學院項目實訓-基于大模型的模擬面試系統-前端美化滾動條問題

模擬面試界面左側底部 通過檢查工具定位到其所在的位置&#xff1a; 直接對該組件進行美化&#xff1a; <!-- AI面試官列表 --><div class"ai-interviewer-section" v-show"activeTab interviewer"><el-scrollbar class"no-horizont…