攔截器和過濾器詳解

在 Java Web 開發中,攔截器(Interceptor)和過濾器(Filter)是兩種常見的請求處理機制,它們用于對請求和響應進行預處理和后處理

1. 過濾器(Filter)

1.1 作用

Filter 主要用于對 請求(request)響應(response) 進行預處理和后處理,通常用于請求日志記錄、編碼設置、安全檢查等場景

1.2 工作原理

  • Filter 作用于 Servlet 之前,對請求進行預處理
  • 處理完請求后,Filter 也可以對響應進行后處理
  • 通過 FilterChain 將請求傳遞給下一個 Filter 或 Servlet

1.3 實現步驟

  1. 實現 javax.servlet.Filter 接口
  2. 重寫 doFilter 方法
  3. web.xml 中進行配置,或者使用 @WebFilter 注解

1.4 示例代碼

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*") // 作用于所有請求
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("Filter: 請求被攔截");chain.doFilter(request, response); // 繼續請求System.out.println("Filter: 響應被攔截");}
}

2. 攔截器(Interceptor)

2.1 作用

Interceptor 主要用于 攔截控制器(Controller)的執行,在方法執行前后視圖渲染前執行特定邏輯,如權限控制、日志記錄、事務管理等

2.2 工作原理

  • Interceptor 依賴 Spring MVC,攔截的是 Controller 的執行過程
  • 可以在**方法調用前(preHandle)、方法調用后(postHandle)、視圖渲染后(afterCompletion)**執行邏輯

2.3 實現步驟

  1. 實現 HandlerInterceptor 接口
  2. 重寫 preHandlepostHandleafterCompletion 方法
  3. 在 Spring 配置中注冊攔截器

2.4 示例代碼

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Interceptor: 進入 Controller 前");return true; // 繼續執行 Controller 方法}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor: 方法執行完畢");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Interceptor: 視圖渲染完成");}
}

2.5 攔截器的注冊

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 InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");}
}

3. 過濾器與攔截器的對比

比較項過濾器(Filter)攔截器(Interceptor)
作用范圍作用于 所有請求(包括靜態資源)作用于 Spring MVC 控制器
依賴Servlet 規范Spring MVC
觸發時機Servlet 之前 處理請求Controller 執行前后 處理請求
適用場景編碼設置、日志記錄、權限控制認證授權、日志、事務處理
處理方式doFilter 方法preHandlepostHandleafterCompletion

4. 總結

  1. Filter 適用于所有請求,包括靜態資源,可以用于通用的請求預處理和后處理
  2. Interceptor 僅攔截 Controller 方法,適用于控制器層面的攔截,如權限控制、事務管理
  3. 在 Spring Boot 應用中,一般推薦使用 Interceptor 來攔截業務邏輯,而使用 Filter 處理通用的請求邏輯

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

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

相關文章

【機械視覺】C#+VisionPro聯合編程———【六、visionPro連接工業相機設備】

【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 目錄 【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 前言: 連接步驟說明 一. 硬件連接 支持的相機接口類型: 連接步驟 2. 軟件配置 Visio…

筆記:基于環境語義的通感融合技術,將傳統通信由“被動接收”轉為“主動感知”

《基于計算機視覺的感知通信融合理論與關鍵技術研發進展》 介紹了聯合研發的基于環境語義的通感融合技術研發進展。 觀點:利用環境感知信息或環境語義輔助通信的通感融合技術成為6G重要方向之一 產出:基于環境感知的毫米波波束管理方案,并…

Kafka 多線程開發消費者實例

目前,計算機的硬件條件已經大大改善,即使是在普通的筆記本電腦上,多核都已經是標配了,更不用說專業的服務器了。如果跑在強勁服務器機器上的應用程序依然是單線程架構,那實在是有點暴殄天物了。不過,Kafka …

zynq7000 + ucos3 + lwip202_v1_2調試過程

1 現在裸機應用上驗證lwip 跑起來可能會報錯,看下面的鏈接解決 zynq 網卡Phy setup error問題 zynq 網卡Phy setup error問題-CSDN博客 2 ping同以后,在zynq上添加ucos系統 鏈接如下: ZYNQ移植uCOSIII_zynq ucos-CSDN博客 3 移植lwip協議…

Android7 Input(二)Linux 驅動層輸入事件管理

概述 在Linux系統中,將鍵盤,鼠標,觸摸屏等這類交互設備交由Linux Input子系統進行管理,Linux Input驅動子系統由于具有良好的和用戶空間交互的接口。因此Linux Input驅動子系統,不止于只管理輸入類型的設備。也可以將其…

Java內存中的Heap(堆)的作用

Java內存中的Heap(堆)的作用 在 Java 的內存模型中,Heap(堆) 是 JVM(Java Virtual Machine)管理的運行時數據區域之一,主要用于存儲程序運行過程中動態分配的對象和數據。它是 Java…

自行車模型與汽車模型的混合策略在自動駕駛中的多維度協同優化

基于動態架構與智能調度的自動駕駛系統設計 #mermaid-svg-1yvF1EzG07ktndY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1yvF1EzG07ktndY6 .error-icon{fill:#552222;}#mermaid-svg-1yvF1EzG07ktndY6 .error-tex…

mysql.8.4.4--初始化報錯--libnuma.so.1缺失

錯誤 mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory解決辦法:下載相關依賴 sudo apt update sudo apt install numactl然后重新初始化 mysqld --initialize

【區塊鏈安全 | 第三篇】主流公鏈以太坊運行機制

文章目錄 1. 以太坊賬戶類型2. 以太坊網絡架構2.1 節點類型2.2 交易流程 3. 共識機制4. Gas 機制4.1 Gas 計算方式4.2 以太坊 EIP-1559 交易機制 5. EVM(以太坊虛擬機)5.1 EVM 結構5.2 EVM 指令5.3 EVM 運行機制 6. 智能合約7. ERC 代幣標準7.1 ERC-207.…

計算機三級信息安全部分英文縮寫

eip,指令寄存器,用于存放指向下一條將執行指令的指針,即返回地址棧頂指針esp基址指針寄存器EBP,基地址數據執行保護DEP(Data Execute Prevention)技術可以設置內存堆棧區的代碼為不可執行狀態,從而防范溢出后代碼的執行…

【Goalng】第九彈-----文件操作、JSON處理

🎁個人主頁:星云愛編程 🔍所屬專欄:【Go】 🎉歡迎大家點贊👍評論📝收藏?文章 長風破浪會有時,直掛云帆濟滄海 目錄 1.文件操作 1.1文件介紹 1.2.文件流 1.3.打開和關閉文件 1…

C#高級:啟動、中止一個指定路徑的exe程序

一、啟動一個exe class Program {static void Main(string[] args){string exePath "D:\測試\Test.exe";// 修改為你要運行的exe路徑StartProcess(exePath);}private static bool StartProcess(string exePath){// 創建一個 ProcessStartInfo 對象來配置進程啟動參…

猜猜我用的是哪個大模型?我的世界游戲界面簡單的模擬效果

我的羅里吧嗦的,根據小朋友的要求,邊聽邊寫邊輸入的提示詞: 請生成一段完整的在網頁中用html5和javascript代碼模擬“我的世界”中游戲場景的互動畫面,要求提供若干人物選項可以選擇,請自行選擇需要使用哪些庫或框架來…

AI知識補全(八):多模態大模型是什么?

名人說:人生如逆旅,我亦是行人。 ——蘇軾《臨江仙送錢穆父》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 上一篇:AI知識補全(七):AI Agent 智能…

更新docker 容器時,提前換后端jar 包,為什么會存在異常

我們現場更新時,通常都是提前將后端jar 包替換了,然后到了更新的時間,只需要更新相關的前端文件和修改各種配置,就行了。 但是最近一次更新操作中,忽然發現,提前更新后端包,會存在依賴丟失問題…

LoRA 模型微調框架核心原理及實現步驟

LoRA(Low-Rank Adaptation)模型微調框架通過低秩矩陣分解原理,實現了對大型預訓練模型的高效微調。其核心原理是:在凍結預訓練模型權重的基礎上,向特定層注入可訓練的低秩矩陣,以極少量參數(通常…

XHR.readyState詳解

XHR.readyState詳解 引言 XHR.readyState是XMLHttpRequest對象的一個屬性,它反映了當前請求的狀態。在Ajax編程中,正確理解和使用XHR.readyState對于調試和確保異步請求的正確執行至關重要。本文將詳細介紹XHR.readyState的屬性值、含義以及在Ajax請求中的具體應用。 XHR.…

MySQL8.4 InnoDB Cluster高可用集群使用指南

簡介 高可用方案 Orchestrator: 可視化 Web 界面管理 MySQL 拓撲結構,并且兼容多種復制架構(異步、半同步、GTID),提供自動和手動的故障轉移。但是8.0.21后 MySQL 更新了主從復制相關命令,Orchestrator無…

擴散模型總結

目錄 定義與原理 發展歷程 正向擴散過程 反向擴散過程 噪聲預測網絡 離散時間模型 連續時間模型 條件擴散模型 生成質量 訓練穩定性 采樣靈活性 圖像生成 音頻合成 文本生成 計算效率 模型復雜度 定義與原理 擴散模型是一種新型的生成模型,其核心原理源于熱力…

【Java】Java核心知識點與相應面試技巧(七)——類與對象(二)

Java 類與對象篇 1.上期面試題解析: 上文鏈接:https://blog.csdn.net/weixin_73492487/article/details/146607026 創建對象時的內存分配過程? ① 加載類 ② 堆內存分配空間 ③ 默認初始化 ④ 顯式初始化 ⑤ 構造器執行 this和super能否同時…