Spring Boot中的攔截器!

每次用戶請求到達Spring Boot服務端,你是否需要重復寫日志、權限檢查或請求格式化代碼?這些繁瑣的“前置后置”工作讓人頭疼!好在,Spring Boot攔截器如同一道智能關卡,統一處理請求的橫切邏輯,讓代碼優雅又高效。X平臺@SpringBootDev稱它為“微服務請求管道的衛兵”!數據顯示,合理使用攔截器可減少50%的冗余代碼,提升30%的開發效率。想讓你的Spring Boot項目更簡潔、性能更優?本文從原理到實戰,帶你玩轉攔截器。

Spring Boot攔截器是什么?它如何簡化請求處理?如何快速實現一個攔截器并應用到項目中?

在一個成熟的Web系統中,登錄校驗、日志記錄、權限控制、接口限流……這些通用邏輯你是否每次都要手動復制粘貼?如果你正在使用SpringBoot框架,恭喜你,有一個“幕后英雄”早已為你準備好了優雅的解決方案——攔截器(Interceptor)!

那么,SpringBoot中的攔截器到底能做什么?它和過濾器、切面之間有什么區別?又該如何在項目中靈活應用?

觀點與案例結合

Spring Boot攔截器基于Spring MVC的HandlerInterceptor接口,通過預處理、后處理和完成處理三個階段,靈活管理請求流程。以下是核心原理與實戰案例,助你快速上手。

攔截器基于Spring MVC,依賴于HandlerInterceptor接口,在請求處理前后發揮作用,具備三大核心方法:

  • preHandle:在控制器執行前調用,可用于登錄驗證。

  • postHandle:控制器處理完畢但未渲染視圖時調用。

  • afterCompletion:整個請求完成后調用,可用于資源清理或異常處理。

1. 攔截器原理:請求生命周期的控制

核心:攔截器在請求到達控制器前(preHandle)、后(postHandle)和響應完成(afterCompletion)執行邏輯。

  • preHandle:請求到達控制器前,適合權限驗證、參數校驗。

  • postHandle:控制器處理后,視圖渲染前,適合修改響應數據。

  • afterCompletion:響應完成后,適合清理資源、記錄日志。
    流程圖

請求 -> preHandle -> 控制器 -> postHandle -> 渲染視圖 -> afterCompletion -> 響應

案例:某電商平臺用攔截器統一校驗用戶Token,攔截90%的非法請求,降低后端壓力。
實踐:理解HandlerInterceptor接口,準備自定義攔截器。

2. 自定義攔截器:實現業務邏輯

場景:記錄請求耗時和用戶身份驗證。
方法:實現HandlerInterceptor接口,重寫三個方法。


代碼(自定義攔截器):

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;public class LoggingInterceptor implements HandlerInterceptor {private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);logger.info("Request URL: {} | Method: {}", request.getRequestURL(), request.getMethod());// 模擬權限校驗String token = request.getHeader("Authorization");if (token == null || token.isEmpty()) {response.setStatus(401);logger.warn("Unauthorized access: Missing token");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {logger.info("Controller processed, preparing response");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {long startTime = (Long) request.getAttribute("startTime");long duration = System.currentTimeMillis() - startTime;logger.info("Request completed in {}ms", duration);if (ex != null) {logger.error("Request failed: {}", ex.getMessage());}}
}

說明:preHandle校驗Token并記錄開始時間,afterCompletion計算耗時并記錄異常。
案例:某微服務用攔截器記錄API耗時,發現慢接口,優化后響應時間從500ms降至200ms。
實踐:在Spring Boot項目中創建上述攔截器,測試日志輸出。

3. 注冊攔截器:應用到項目

場景:將攔截器應用到特定路徑或全局。
方法:通過WebMvcConfigurer注冊攔截器,指定攔截路徑。


代碼(攔截器配置):

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/api/**") // 攔截/api/下的請求.excludePathPatterns("/api/public/**"); // 排除公共接口}
}

說明:攔截/api/**路徑,排除/api/public/**,靈活控制范圍。
案例:某博客系統用攔截器對/api/admin/**路徑做權限校驗,防止未授權訪問,安全性提升100%。
實踐:在Spring Boot項目中添加上述配置,測試攔截效果。

4. 實戰應用:典型場景

場景1:日志記錄

  • 用攔截器記錄請求URL、方法、耗時,上傳到ELK分析。

  • 案例:某金融平臺通過攔截器日志發現高頻接口瓶頸,優化后吞吐量提升40%。

場景2:權限驗證

  • 在preHandle檢查用戶Token或角色,攔截非法請求。

  • 案例:某SaaS平臺用攔截器統一JWT驗證,減少控制器代碼50%。

場景3:請求預處理

  • 統一處理請求頭、參數格式化或CORS設置。

  • 案例:某跨境電商用攔截器添加CORS頭,支持跨域訪問,用戶體驗提升20%。

實踐:選擇一個場景(如JWT驗證),用攔截器實現并集成到項目。

5. 注意事項與優化

注意事項

  • 性能:攔截器邏輯需輕量,避免復雜計算影響性能。

  • 順序:多個攔截器按注冊順序執行,注意邏輯沖突。

  • 異常處理:在afterCompletion捕獲異常,防止漏報。
    優化技巧

  • 用ThreadLocal存儲請求上下文,避免重復計算。

  • 結合Spring Security替換部分權限驗證邏輯,簡化攔截器。
    案例:某高并發系統用ThreadLocal優化攔截器,減少10%的內存開銷。
    實踐:在攔截器中添加ThreadLocal存儲用戶ID,測試性能提升。

對比維度攔截器(Interceptor)過濾器(Filter)AOP(面向切面編程)
作用域針對Spring MVC框架的請求處理流程Servlet容器級別的請求/響應處理方法級別的橫切關注點
執行時機Controller方法調用前后、視圖渲染前后請求到達Servlet前和響應返回前方法執行前、后或異常時
實現方式實現HandlerInterceptor接口實現javax.servlet.Filter接口通過切面(Aspect)、通知(Advice)等實現
依賴關系依賴Spring MVC框架依賴Servlet容器依賴Spring AOP或AspectJ
典型應用場景權限檢查、日志記錄、參數預處理等字符編碼設置、XSS防護、全局跨域處理等事務管理、性能監控、緩存、異常處理等
優點1. 與Spring集成度高
2. 可以獲取Handler信息
1. 更底層
2. 能處理靜態資源
1. 解耦性好
2. 功能強大靈活
缺點1. 僅作用于Controller層
2. 功能相對簡單
1. 無法獲取Spring上下文
2. 不能精細控制處理流程
1. 學習曲線陡峭
2. 性能開銷相對較大

社會現象分析

隨著微服務架構的普及和接口安全日益重要,后端開發者對“統一入口控制”的需求愈發強烈。攔截器的使用,已經從“可選項”升級為“架構標配”。它在權限系統、接口防刷、接口日志、用戶行為記錄等方面被廣泛采納。


企業中,攔截器廣泛用于API網關、日志收集和安全防護,如銀行系統通過攔截器統一記錄交易日志,確保審計合規。開源社區(如Spring)的攔截器教程Star數超2萬,反映開發者對其依賴。攔截器不僅是技術工具,更是提升代碼質量和效率的利器。

總結與升華

SpringBoot攔截器,是連接前端請求與后端業務的“守門員”,掌握其使用,意味著你對Web請求處理流程的理解又邁進了一大步。

Spring Boot攔截器通過preHandle、postHandle和afterCompletion三階段,統一處理請求的日志、權限和預處理邏輯。它不僅簡化了代碼,還提升了系統的可維護性和性能。從日志記錄到權限驗證,攔截器是Spring Boot開發的得力助手。掌握攔截器,你的Web項目將更加優雅,開發效率一飛沖天!

攔截器之于SpringBoot,就像防火墻之于網絡——不可見,卻守護著系統的每一次請求安全。

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

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

相關文章

三個線程 a、b、c 并發運行,b,c 需要 a 線程的數據如何解決

說明: 開發中經常會碰到線程并發,但是后續線程需要等待第一個線程執行完返回結果后,才能再執行后面線程。 如何處理呢,今天就介紹兩種方法 1、使用Java自有的API即CountDownLatch,進行實現 思考:CountDown…

js原型污染 + xss劫持base -- no-code b01lersctf 2025

題目信息:Found this new web framework the other day—you don’t need to write any code, just JSON. 我們先來搞清楚究竟發生了什么 當我們訪問 /index /*** 處理 /:page 路徑的 GET 請求* param {Object} req - 請求對象* param {Object} reply - 響應對象* returns {Pro…

Qwen智能體qwen_agent與Assistant功能初探

Qwen智能體qwen_agent與Assistant功能初探 一、Qwen智能體框架概述 Qwen(通義千問)智能體框架是阿里云推出的新一代AI智能體開發平臺,其核心模塊qwen_agent.agent提供了一套完整的智能體構建解決方案。該框架通過模塊化設計,將L…

vue數據可視化開發常用庫

一、常用數據可視化庫 1. ECharts 特點&#xff1a;功能強大&#xff0c;支持多種圖表類型&#xff0c;社區活躍。適用場景&#xff1a;復雜圖表、大數據量、3D 可視化。安裝&#xff1a;npm install echarts示例&#xff1a;<template><div ref"chart" c…

小紅書視頻無水印下載方法

下載小紅書&#xff08;RED/Xiaohongshu&#xff09;視頻并去除水印可以通過以下幾種方法實現&#xff0c;但請注意尊重原創作者版權&#xff0c;下載內容僅限個人使用&#xff0c;避免侵權行為。 方法一&#xff1a;使用在線解析工具&#xff08;推薦&#xff09; 復制視頻鏈…

Qt讀寫XML文檔

XML 結構與概念簡介 XML&#xff08;可擴展標記語言&#xff09; 是一種用于存儲和傳輸結構化數據的標記語言。其核心特性包括&#xff1a; 1、樹狀結構&#xff1a;XML 數據以層次化的樹形結構組織&#xff0c;包含一個根元素&#xff08;Root Element&#xff09;&#xff…

lambda 表達式

C 的 lambda 表達式 是一種輕量、內聯的函數對象寫法&#xff0c;廣泛用于標準算法、自定義回調、事件響應等場景。它簡潔且強大。以下將系統、詳細地講解 lambda 的語法、捕獲規則、應用技巧和實際使用場景。 &#x1f9e0; 一、基本語法 [捕獲列表](參數列表) -> 返回類型…

Web端項目系統訪問頁面很慢,后臺數據返回很快,網絡也沒問題,是什么導致的呢?

Web端訪問緩慢問題診斷指南(測試工程師專項版) ——從瀏覽器渲染到網絡層的全鏈路排查方案 一、問題定位黃金法則(前端性能四象限) 1. [網絡層] 數據返回快 ≠ 資源加載快(檢查Content Download時間) 2. [渲染層] DOM復雜度與瀏覽器重繪(查看FPS指標) 3. [執行層…

Docker網絡模式深度解析:Bridge與Host模式對比及實踐指南

#作者&#xff1a;鄧偉 文章目錄 一、引言二、Bridge模式&#xff08;網橋模式&#xff09;2.1 工作原理2.2 核心特性2.4 適用場景2.5 優缺點分析 三、Host模式3.1 工作原理3.2 核心特性3.3 配置方法3.4 適用場景3.5 優缺點分析 四、網橋模式與Host模式對比五、最佳實踐與注意…

React+Taro選擇日期組件封裝

話不多說&#xff0c;直接上效果 1.頁面渲染時間模塊 {this.renderCalendarPopup()}2.引入時間組件彈層&#xff0c;state中加入showPopup(控制什么時候展示時間選擇彈層)&#xff0c;time(選擇后的時間值) private renderCalendarPopup () > {const { showPopup, time…

備戰藍橋杯國賽第一天-atcoder-beginner-contest404

B. 因為只有四種情況&#xff0c;旋轉90/180/270度后替換&#xff0c;直接替換&#xff0c;暴力即可 C. 循環圖的定義是每個點出度為2&#xff0c;而且只有一個環的&#xff0c;所以先判斷出度&#xff0c;再判斷是否成環 #include <bits/stdc.h> using namespace st…

Linux59 SSH配置前瞻 JumpServer雙網卡ping通

為什么Ping這個IP地址Ping得通 本地址 [rootlocalhost network-scripts]# cat ifcfg-ens33 iTYPEEthernet BOOTPROTOnone DEFROUTEyes DEVICEens33 ONBOOTno IPADDR192.168.235.4 NETMASK255.255.255.0 GATEWAY192.168.235.2 DNS1114.114.114.114 [rootlocalhost network-scrip…

Spring框架(1)

Spring框架是Java企業級開發中最受歡迎的框架之一&#xff0c;它通過簡化開發流程、降低耦合度&#xff0c;讓開發者能夠更專注于業務邏輯的實現。本文將帶你了解Spring框架的核心概念和基本用法。 一、Spring框架簡介 Spring是一個輕量級的開源Java開發框架&#xff0c;由Ro…

QWindowkit 實現無邊框,陰影支持系統邊欄縮放等功能

一.感謝作者,QWindowkit 源碼地址: GitHub - stdware/qwindowkit: Cross-platform frameless window framework for Qt. Support Windows, macOS, Linux. 二.集成pro工程: QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 # Yo…

-bash: /usr/local/mysql/bin/mysqld: No such file or directory

-bash: /usr/local/mysql/bin/mysqld: No such file or directory 1.Mysql安裝常見的報錯信息1.1.報錯信息1.2.分析問題1.3.解決問題 endl 1.Mysql安裝常見的報錯信息 1.1.報錯信息 [rootRocky9-12 ~]#echo $PATH /root/.local/bin:/root/bin:/usr/local/mysql/bin:/usr/loca…

【愚公系列】《Manus極簡入門》027-數據故事講述師:“數據敘事魔法師”

&#x1f31f;【技術大咖愚公搬代碼&#xff1a;全棧專家的成長之路&#xff0c;你關注的寶藏博主在這里&#xff01;】&#x1f31f; &#x1f4e3;開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主&#xff01; &#x1f…

PostgreSQL可見性映射VM

1.可見性映射 清理過程的代價高昂&#xff0c;為了減小清理的開銷&#xff0c;在PostgreSQL 8.4版中引入了VM。 VM的基本概念很簡單。 每個表都擁有各自的可見性映射&#xff0c;用于保存表文件中每個頁面的可見性。 頁面的可見性確定了每個頁面是否包含死元組。清理過程可以…

LeapVAD:通過認知感知和 Dual-Process 思維實現自動駕駛飛躍——論文閱讀

《LeapVAD: A Leap in Autonomous Driving via Cognitive Perception and Dual-Process Thinking》2025年1月發表&#xff0c;來自浙江大學、上海AI實驗室、慕尼黑工大、同濟大學和中科大的論文。 盡管自動駕駛技術取得了顯著進步&#xff0c;但由于推理能力有限&#xff0c;數…

二分系列題

1. 搜索插入位置 /*** 查找插入的位置&#xff1a;返回第一個大于等于 target 的索引&#xff1b;* 如果 target 大于所有元素&#xff0c;則返回數組長度&#xff08;即插入到末尾&#xff09;*/ class Solution {public int searchInsert(int[] nums, int target) {int left …

Octave 簡介:一款強大的開源科學計算工具

引言 在科學計算、數據分析和數值模擬的領域&#xff0c;選擇合適的工具對于提升工作效率和性能至關重要。雖然市面上有許多選擇&#xff0c;但 GNU Octave 作為一款功能強大、開源免費的軟件&#xff0c;它在科學計算中脫穎而出。如果你是學生、研究人員或開發者&#xff0c;…