Spring Boot 統一功能處理:攔截器詳解

一、攔截器核心概念

作用:攔截器是 Spring 框架提供的核心功能,用于在請求處理前后執行預定義邏輯,實現統一處理(如登錄校驗、日志記錄等)。

核心方法

public class LoginInterceptor implements HandlerInterceptor {// 目標方法執行前調用(核心控制點)@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {return true; // true=放行, false=攔截}// 目標方法執行后調用(Controller 方法執行完畢)@Overridepublic void postHandle(...) { ... }// 整個請求完成后的最終處理(視圖渲染后)@Overridepublic void afterCompletion(...) { ... }
}

二、攔截器使用步驟
1. 定義攔截器
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, ...) {// 登錄校驗示例HttpSession session = request.getSession(false);if (session == null || session.getAttribute("USER") == null) {response.setStatus(401); // 401 Unauthorizedreturn false; // 攔截請求}return true; // 放行}
}
2. 注冊攔截器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**")          // 攔截所有路徑.excludePathPatterns("/login")    // 排除登錄接口.excludePathPatterns("/**/*.js")  // 排除靜態資源.excludePathPatterns("/**/*.css");}
}

三、攔截路徑配置規則
路徑模式匹配示例不匹配示例
/*/user,?/book/user/login
/**/user,?/user/profile-
/book/*/book/add,?/book/detail/book/1/author
/book/**/book,?/book/1/author/user/books

四、攔截器執行流程


五、登錄校驗實戰案例
1. 攔截器實現
public boolean preHandle(...) {if (request.getSession().getAttribute("USER") == null) {response.setStatus(401);return false;}return true;
}
2. 前端處理攔截
// AJAX 錯誤處理
$.ajax({error: function(error) {if (error.status === 401) {window.location.href = "/login.html"; // 跳轉登錄頁}}
});

六、設計模式:適配器原理

攔截器底層實現

// DispatcherServlet 核心代碼
protected void doDispatch(...) {// 1. 獲取攔截器鏈HandlerExecutionChain mappedHandler = getHandler(request);// 2. 執行 preHandle()if (!mappedHandler.applyPreHandle(request, response)) {return; // 攔截請求}// 3. 執行 Controller 方法mv = ha.handle(...);// 4. 執行 postHandle()mappedHandler.applyPostHandle(...);// 5. 渲染視圖后執行 afterCompletion()processDispatchResult(...);
}

適配器模式應用

  • HandlerAdapter?適配不同類型的控制器(如?@ControllerHttpRequestHandler

  • 解決不同處理器接口的兼容問題


七、最佳實踐建議
  1. 路徑排除:靜態資源(JS/CSS/圖片)必須排除

  2. 性能優化:在?preHandle()?中盡早返回攔截結果

  3. 異常處理:結合?@ControllerAdvice?統一處理攔截器拋出的異常

  4. 執行順序:多個攔截器按注冊順序執行?preHandle(),逆序執行?postHandle()

  5. 生產建議

    • 登錄攔截器排除?/login,?/health?等公開接口

    • 敏感操作(如支付)使用獨立攔截器增強校驗

// 多攔截器配置示例
registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);

總結核心價值

  1. 解耦:將通用邏輯(如鑒權)從業務代碼剝離

  2. 復用:一次編寫,全局生效

  3. 可維護:統一修改攔截邏輯,避免散彈式修改

  4. 安全:強制實施安全策略(如所有接口必須認證)

通過攔截器 + 統一返回格式 + 統一異常處理,可構建高可維護性的 Spring Boot 后端架構,

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

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

相關文章

在docker容器中安裝docker服務,基于fuse-overlayfs進行overlay掛載,而不是vfs

1、docker 安裝 正常安裝docker軟件,運行docker時,會提示:No docker socket 服務 2、啟動docker服務(包含守護進程) systemctl start docker #dockerd &if ! ps aux | grep -v grep | grep -q "dockerd&qu…

虛擬機配置注意事項

一.VM大部分產品免費,遇到付費的要斟酌一下 在小編之前的文章中有簡單下載VM的教程VMwareWorkstPro安裝-CSDN博客 二.配置過程中的設置大部分都可以在配置完成后更改 例如下圖設備所涉及到的,都是可以更改設置的 三.電腦關機時,要注意先把…

openGL+QT快速學習和入門案列

openGLQT快速學習和入門案列

深度學習03 人工神經網絡ANN

什么是神經網絡 人工神經網絡( Artificial Neural Network, 簡寫為ANN)也簡稱為神經網絡(NN),是一種模仿生物神經網絡結構和功能的計算模型,人腦可以看做是一個生物神經網絡,由眾多的神經元連接而成.各個神經元傳遞復…

Linux中部署Jenkins保姆間教程

本文將以docker的方式,講述如何部署Jenkins 一、拉取Jenkins鏡像 1.1 最新版Jenkins介紹 最新版Jenkins地址:Download and deploy 當前最新版的如下圖所示: 1.2 各版本支持的JDK版本 地址如下:Java Support Policy 如果你安裝…

【軟考中級·軟件評測師】下午題·面向對象測試之架構考點全析:分層、分布式、微內核與事件驅動

一、分層架構:分層獨立與質量特性的雙向約束 分層架構通過“垂直分層(表示層→服務層→業務邏輯層→數據層)”實現職責隔離,是Web應用、企業級系統的主流架構模式。 1. 父類成員函數重測場景 子類繼承父類時,若父類…

C++ 快速回顧(五)

C 快速回顧(五) 前言一、Dll和Lib的區別區別在開發中使用 二、封裝并使用C庫1.封裝庫2.使用庫 三、封裝并使用C庫1.封裝庫2.使用庫 前言 用于快速回顧之前遺漏或者補充C知識 一、Dll和Lib的區別 靜態庫(LIB)在編譯時鏈接&#…

【ARM】解決ArmDS的工程沒有生成Map文件的問題

1、 文檔目標 在嵌入式開發過程中,使用Arm Development Studio(簡稱ArmDS)進行項目構建時,Map文件的生成是調試和分析代碼的重要環節。Map文件不僅記錄了程序中各個段(sections)的內存分布情況&#xff0c…

Java如何導出word(根據模板生成),通過word轉成pdf,放壓縮包

<!-- 導出word文檔所需依賴--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0-beta</version></dependency><dependency><groupId>org.apache.poi</gr…

【C#】 DevExpress.XtraEditors.SidePanel

DevExpress.XtraEditors.SidePanel&#xff0c; 它是 DevExpress 提供的“側邊滑出”面板&#xff08;類似于抽屜、浮動信息區&#xff09;&#xff0c;非常適合做可隱藏的參數區、幫助區、臨時交互區等。 SidePanel 用法核心點 1. 基本用法 可容納其它控件&#xff0c;就像普…

1.1_2 計算機網絡的組成和功能

在這個視頻中&#xff0c;我們會探討計算機網絡的組成和功能。我們會從三個視角去探討計算機網絡由哪些部分組成&#xff0c;其次&#xff0c;我們會簡單的了解計算機網絡的功能。 首先我們可以把計算機網絡看作是由硬件、軟件和協議共同組成的一個龐大復雜的系統。首先在硬件上…

Linux驅動學習day11(定時器)

定時器 定時器主要作用就是&#xff1a;設置超時時間&#xff0c;執行超時函數。 按鍵按下存在抖動&#xff0c;為了消除抖動可以設置定時器&#xff0c;如上圖所示&#xff0c;按下一次按鍵會產生多次抖動&#xff0c;即會產生多次中斷&#xff0c;在每次中斷產生的時候&…

Java 編程之觀察者模式詳解

一、什么是觀察者模式&#xff1f; 觀察者模式&#xff08;Observer Pattern&#xff09;是一種行為型設計模式&#xff0c;用于對象之間的一對多依賴關系&#xff1a;當被觀察對象&#xff08;Subject&#xff09;狀態發生變化時&#xff0c;所有依賴它的觀察者&#xff08;O…

【C++】經典string類問題

目錄 1. 淺拷貝 2. 深拷貝 3. string類傳統寫法 4. string類現代版寫法 5. 自定義類實現swap成員函數 6. 標準庫swap函數的調用 7. 引用計數和寫時拷貝 1. 淺拷貝 若string類沒有顯示定義拷貝構造函數與賦值運算符重載&#xff0c;編譯器會自動生成默認的&#xff0c…

kotlin中object:的用法

在Kotlin中&#xff0c;object: 用于聲明匿名對象&#xff08;Anonymous Object&#xff09;&#xff0c;這是實現接口或繼承類的輕量級方式&#xff0c;無需顯式定義具名類。以下是核心用法和場景&#xff1a; 1. 基本語法 val obj object : SomeInterface { // 實現接口ov…

js代碼04

題目 非常好。我們剛剛看到了回調函數在處理多個異步操作時會變得多么混亂&#xff08;回調地獄&#xff09;。為了解決這個問題&#xff0c;現代 JavaScript 提供了一個更強大、更優雅的工具&#xff1a;Promise。 Promise&#xff0c;正如其名&#xff0c;是一個“承諾”。…

Jenkins初探-通過Docker部署Jenkins并安裝插件

簡介 本文介紹了使用Docker安裝Jenkins并進行初始配置的完整流程。主要內容包括&#xff1a; (1)通過docker pull命令獲取Jenkins鏡像&#xff1b;(2)使用docker run命令啟動容器并映射端口&#xff1b;(3)訪問Jenkins界面獲取初始管理員密碼&#xff1b;(4)安裝推薦插件并創…

嵌入式開發:GPIO、UART、SPI、I2C 驅動開發詳解與實戰案例

&#x1f4cd; 本文為嵌入式學習系列第二篇&#xff0c;基于 GitHub 開源項目&#xff1a;0voice/EmbeddedSoftwareLearn &#x1f4ac; 作者&#xff1a;0voice &#x1f440; 適合對象&#xff1a;嵌入式初學者、STM32學習者、想搞明白外設驅動開發的C語言學習者 一、驅動是什…

常用 Linux 命令和 shell 腳本語言整理

目錄 一、Linux 命令大全 1、文件和目錄操作 &#xff08;1&#xff09;ls 列出目錄內容 &#xff08;2&#xff09;pwd 查看當前目錄 &#xff08;3&#xff09;cd 切換目錄 &#xff08;4&#xff09;mkdir 創建目錄 &#xff08;5&#xff09;cp 復制文件或目錄 &…

YOLOv12_ultralytics-8.3.145_2025_5_27部分代碼閱讀筆記-autobackend.py

autobackend.py ultralytics\nn\autobackend.py 目錄 autobackend.py 1.所需的庫和模塊 2.def check_class_names(names: Union[List, Dict]) -> Dict[int, str]: 3.def default_class_names(data: Optional[Union[str, Path]] None) -> Dict[int, str]: 4.cla…