攔截器VS過濾器:Spring Boot中請求處理的藝術!

在這里插入圖片描述

目錄

    • 一、攔截器(Interceptor)和過濾器(Filter):都是“守門員”!
    • 二、如何實現攔截器和過濾器?
    • 三、攔截器和過濾器的區別
    • 四、執行順序
    • 五、真實的應用場景
    • 六、總結

🌟如果喜歡作者的講解方式,關注作者不迷路,同時也可以看看我的其他文章! 感謝!!!
🌟 從樂高積木到樂隊指揮,用最通俗易懂的方式帶你玩轉 Spring Boot Bean!

就讓我用這篇文章來講解 SpringBoot 的攔截器和過濾器吧,給它安排明白!😎

一、攔截器(Interceptor)和過濾器(Filter):都是“守門員”!

想象一下,你的 SpringBoot 應用就像一個豪華酒店🏨。

  • 過濾器(Filter): 就像酒店大門口的保安👮,負責檢查所有進出酒店的人(請求)。它可以決定是否允許客人進入,或者在客人進入前做一些處理,比如檢查身份證、測量體溫🌡?。
  • 攔截器(Interceptor): 就像酒店內部各個樓層的樓層經理👩?💼,只負責檢查進入特定樓層(Controller)的客人。它可以在客人進入樓層前、進入樓層后、離開樓層后都進行干預,比如登記訪客信息、提供樓層指引🗺?。

二、如何實現攔截器和過濾器?

1. 過濾器(Filter):

  • 步驟一: 創建一個類,實現 javax.servlet.Filter 接口。
  • 步驟二: 實現 doFilter() 方法。這個方法就是過濾器的核心邏輯,在這里你可以對請求和響應進行處理。
  • 步驟三: 使用 @WebFilter 注解或者在 WebConfig 類中注冊過濾器。
// 方式一:使用 @WebFilter 注解
@WebFilter(urlPatterns = "/*", filterName = "MyFilter") // 攔截所有請求
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("過濾器:請求來了!我要檢查一下!🧐");// 可以對 request 和 response 進行處理HttpServletRequest req = (HttpServletRequest) request;String uri = req.getRequestURI();System.out.println("請求的URI:" + uri);// 放行,讓請求繼續往下走chain.doFilter(request, response);System.out.println("過濾器:請求走了!我要記錄一下!📝");}
}// 方式二:在 WebConfig 類中注冊
@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilterRegistrationBean() {FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new MyFilter());registration.addUrlPatterns("/*"); // 攔截所有請求registration.setName("MyFilter");registration.setOrder(1); // 設置優先級,數字越小優先級越高return registration;}
}

2. 攔截器(Interceptor):

  • 步驟一: 創建一個類,實現 org.springframework.web.servlet.HandlerInterceptor 接口。
  • 步驟二: 實現 preHandle()postHandle()afterCompletion() 方法。
    • preHandle():在 Controller 處理請求之前調用,可以進行權限驗證、參數校驗等。如果返回 false,則請求會被攔截,不會繼續執行。
    • postHandle():在 Controller 處理請求之后,但在視圖渲染之前調用,可以對 ModelAndView 進行修改。
    • afterCompletion():在整個請求處理完畢之后調用,可以進行資源清理、日志記錄等。
  • 步驟三: 創建一個配置類,實現 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 接口,并重寫 addInterceptors() 方法,將攔截器注冊到 Spring 容器中。
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("攔截器:Controller 要處理請求了!我要先檢查一下!👮?♀?");// 可以進行權限驗證、參數校驗等String token = request.getHeader("token");if (token == null || token.isEmpty()) {System.out.println("攔截器:沒有 token,拒絕訪問!🚫");response.setStatus(401); // 返回未授權狀態碼return false; // 攔截請求}return true; // 放行請求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("攔截器:Controller 處理完請求了!我可以修改 ModelAndView!🎨");// 可以對 ModelAndView 進行修改if (modelAndView != null) {modelAndView.addObject("message", "攔截器添加的額外信息!🎁");}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("攔截器:請求處理完成了!我可以清理資源、記錄日志!🧹");// 可以進行資源清理、日志記錄等}
}@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/api/**") // 攔截 /api/ 下的所有請求.excludePathPatterns("/api/login"); // 排除 /api/login 請求}
}

三、攔截器和過濾器的區別

特性過濾器(Filter)攔截器(Interceptor)
實現方式實現 javax.servlet.Filter 接口實現 org.springframework.web.servlet.HandlerInterceptor 接口
攔截范圍攔截所有進出 Servlet 容器的請求攔截特定的 Controller 方法
執行時機在 DispatcherServlet 之前和之后執行在 Controller 方法執行之前、之后和完成之后執行
依賴性不依賴 Spring 容器依賴 Spring 容器,可以訪問 Spring 上下文
功能字符編碼轉換、請求內容過濾、敏感詞過濾等權限驗證、日志記錄、參數校驗等
精確度粗粒度,只能攔截 URL細粒度,可以訪問 HandlerMethod,獲取方法信息

總結:

  • 過濾器: 攔截所有請求,不依賴 Spring,功能比較通用。
  • 攔截器: 攔截特定 Controller 方法,依賴 Spring,功能更精細。

四、執行順序

  1. 過濾器(Filter):在 DispatcherServlet 之前執行。
  2. 攔截器(Interceptor)
    • preHandle():在 Controller 方法執行之前執行。
    • Controller 方法執行。
    • postHandle():在 Controller 方法執行之后,但在視圖渲染之前執行。
    • 視圖渲染。
    • afterCompletion():在整個請求處理完畢之后執行。

記住: 多個過濾器和攔截器可以配置執行順序,通常通過 order 屬性或者 @Order 注解來設置,數字越小優先級越高。

五、真實的應用場景

  • 過濾器:
    • 字符編碼轉換: 統一設置請求和響應的字符編碼,避免亂碼。
    • XSS 攻擊防御: 過濾請求中的惡意腳本,防止 XSS 攻擊。
    • 日志記錄: 記錄所有請求的 URL、IP 地址等信息。
  • 攔截器:
    • 權限驗證: 檢查用戶是否已登錄,是否有權限訪問特定資源。
    • 參數校驗: 校驗請求參數的合法性,防止惡意請求。
    • 性能監控: 記錄 Controller 方法的執行時間,分析性能瓶頸。
    • 防止重復提交: 避免用戶重復提交表單。

六、總結

  • 過濾器: 就像酒店大門口的保安,啥人都攔,主要做一些通用的檢查,比如身份證、體溫啥的。
  • 攔截器: 就像樓層經理,只管特定樓層的人,可以做更細致的檢查,比如登記訪客信息、提供樓層指引。
  • 執行順序: 先保安,再樓層經理。保安先檢查,樓層經理在客人進房間前、進房間后、離開房間后都可以管。

如果編寫了AOP邏輯,會在攔截器之后執行,相關內容請看:
🔗被重復代碼逼瘋?AOP來當“舔狗”!日志/事務/權限,隨叫隨到!

希望這篇文章能讓你有趣的理解 SpringBoot 的攔截器和過濾器!🎉🎉🎉

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

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

相關文章

FastGPT及大模型API(Docker)私有化部署指南

??歡迎關注【AI技術開發者】 ? 經過優化&#xff0c;在不影響FastGPT功能的情況下&#xff0c;大幅降低了部署的設備配置要求&#xff0c;僅需1c1h即可正常部署使用。 官方要求配置&#xff1a; ? ? 優化后的實際占用情況&#xff1a; 運行內存僅需370M&#xff08…

解決 WSL Ubuntu 中 /etc/resolv.conf 自動重置問題

解決 WSL Ubuntu 中 /etc/resolv.conf 自動重置問題 前言問題描述問題原因嘗試過的命令及分析解決方案&#xff1a;修改 wsl.conf 禁用自動生成總結 前言 在使用 Windows Subsystem for Linux (WSL) 的 Ubuntu 子系統時&#xff0c;你可能會遇到 /etc/resolv.conf 文件被自動重…

【第15章:量子深度學習與未來趨勢—15.3 量子深度學習在圖像處理、自然語言處理等領域的應用潛力分析】

一、開篇:為什么我們需要關注這場"量子+AI"的世紀聯姻? 各位技術愛好者們,今天我們要聊的這個話題,可能是未來十年最值得押注的技術革命——量子深度學習。這不是簡單的"1+1=2"的物理疊加,而是一場可能徹底改寫AI發展軌跡的范式轉移。 想象這樣一個…

企業軟件合規性管理:構建高效、安全的軟件資產生態

引言 在數字化轉型的浪潮下&#xff0c;企業的軟件使用方式日益多元化&#xff0c;涉及云端、訂閱制、永久授權及浮動許可等多種模式。然而&#xff0c;隨著軟件資產的增多&#xff0c;企業面臨著合規性管理的嚴峻挑戰&#xff1a;非法軟件使用、許可證管理不當、軟件資產閑置…

python學習筆記,python處理 Excel、Word、PPT 以及郵件自動化辦公

文章目錄 前言一、環境搭建1. 下載 Python2. 安裝 Python 二、處理 Excel 文件&#xff08;openpyxl庫&#xff09;三、 處理 Word 文件&#xff08;python-docx庫&#xff09;四、 處理 PPT 文件&#xff08;python-pptx庫&#xff09;五、 自動發送郵件&#xff08;smtplib和…

Python 基礎-循環

目錄 簡介 break continue 小結 簡介 要計算123&#xff0c;我們可以直接寫表達式&#xff1a; >>> 1 2 3 6要計算123...10&#xff0c;勉強也能寫出來。 但是&#xff0c;要計算123...10000&#xff0c;直接寫表達式就不可能了。 為了讓計算機能計算成千上…

簡單易懂,解析Go語言中的Channel管道

Channel 管道 1 初始化 可用var聲明nil管道&#xff1b;用make初始化管道&#xff1b; len()&#xff1a; 緩沖區中元素個數&#xff0c; cap()&#xff1a; 緩沖區大小 //變量聲明 var a chan int //使用make初始化 b : make(chan int) //不帶緩沖區 c : make(chan stri…

python-leetcode 36.二叉樹的最大深度

題目&#xff1a; 給定一個二叉樹root,返回其最大深度 二叉樹的最大深度是指從根節點到最遠葉子節點的最長路徑上的節點數 方法一&#xff1a;深度優先搜索 知道了左子樹和右子樹的最大深度l和r&#xff0c;那么該二叉樹的最大深度即為:max(l,r)1 而左子樹和右子樹的最大深…

RESTful 的特點與普通 Web API 的區別

RESTful 是一種設計風格&#xff0c;而不僅僅是普通的 Web API。它遵循一些特定的原則和約束&#xff0c;使得 API 更加簡潔、可擴展和易于理解。以下是 RESTful 的特點&#xff0c;以及與普通 Web API 的區別&#xff1a; RESTful 的特點 1. 資源導向 RESTful API 的核心是資…

結構風荷載理論與Matlab計算

結構風荷載理論與matlab計算的實例程序&#xff0c;適合初學者理解matlab風荷載計算 資源文件列表 程序_結構風荷載理論與Matlab計算/chapter1/exam_simWind_1_1.m , 1035 程序_結構風荷載理論與Matlab計算/chapter1/Extrmv.m , 303 程序_結構風荷載理論與Matlab計算/chapter1…

numpy(02 數據類型和數據類型轉換)

numpy(01 入門) 目錄 一、Python NumPy 數據類型 1.1 NumPy 基本類型 1.2 數據類型對象 (dtype) 1.3 具體實例 二、Numpy數據類型轉換 2.1 浮點數據轉換 2.2 整型數據轉換 2.3 浮點數轉整數 一、Python NumPy 數據類型 1.1 NumPy 基本類型 下表列舉了常用 NumPy 基…

【雅思博客04】Silence please!

A: Those people in front of us are making so much noise. It’s so inconsiderate! B: Don’t worry about it; it’s not such a big deal. A: Oh... I can’t hear a thing! Excuse me, can you keep it down? C: Sure, sorry about that! A: Someone’s phone is ri…

【大語言模型_3】ollama本地加載deepseek模型后回答混亂問題解決

背景&#xff1a; 本地下載了DeepSeek-R1-Distill-Qwen-7B模型后&#xff0c;通過ollama create DeepSeek-R1-Distill-Qwen-7B -f ds7b.mf加載模型啟動后回答混亂&#xff0c;無法使用。 解決方法 重新下載模型&#xff0c;選擇了DeepSeek-R1-Distill-Qwen-7B-Q4_K_M.gguf 重…

nginx ngx_http_module(9) 指令詳解

nginx ngx_http_module(9) 指令詳解 nginx 模塊目錄 nginx 全指令目錄 一、目錄 1.1 模塊簡介 ngx_http_uwsgi_module&#xff1a;uWSGI支持模塊&#xff0c;允許Nginx與uWSGI服務器進行通信。uWSGI是一種應用服務器協議&#xff0c;廣泛用于Python Web應用的部署。通過該…

用PyInstaller構建動態腳本執行器:嵌入式Python解釋器與模塊打包 - 簡明教程

技術場景&#xff1a; 需分發的Python工具要求終端用戶可動態修改執行邏輯將Python環境與指定庫&#xff08;如NumPy/Pandas&#xff09;嵌入可執行文件實現"一次打包&#xff0c;動態擴展"的輕量化解決方案。 ▌ 架構設計原理 1. 雙模運行時識別 # 核心判斷邏輯…

山石網科×阿里云通義靈碼,開啟研發“AI智造”新時代

近日&#xff0c;山石網科正式宣布全面接入阿里云通義靈碼企業專屬版&#xff0c;這標志著山石網科在研發智能化、自動化領域邁出重要一步&#xff0c;為研發工作注入強大的AI動力&#xff0c;實現多維度的效率飛躍。 此次合作&#xff0c;阿里云通義靈碼依托強大的AI能力&…

《被討厭的勇氣》(六)

1.自由就是被別人討厭。 2.毫不在意別人的評價、不害怕被別人討厭、不追求被他人認可&#xff0c;如果不付出以上這些代價&#xff0c;那就無法貫徹自己的生活方式&#xff0c;也就是不能獲得自由。 3.在意你的臉的只有你自己。 4.不去干涉別人的課題也不讓別人干涉自己的課題.…

使用 PyTorch 實現標準卷積神經網絡(CNN)

卷積神經網絡&#xff08;CNN&#xff09;是深度學習中的重要組成部分&#xff0c;廣泛應用于圖像處理、語音識別、視頻分析等任務。在這篇博客中&#xff0c;我們將使用 PyTorch 實現一個標準的卷積神經網絡&#xff08;CNN&#xff09;&#xff0c;并介紹各個部分的作用。 什…

SpringBoot2.0整合Redis(Lettuce版本)

前言&#xff1a; 目前java操作redis的客戶端有jedis跟Lettuce。在springboot1.x系列中&#xff0c;其中使用的是jedis, 但是到了springboot2.x其中使用的是Lettuce。 因為我們的版本是springboot2.x系列&#xff0c;所以今天使用的是Lettuce。關于jedis跟lettuce的區別&#…

qt + opengl 給立方體增加陰影

在前幾篇文章里面學會了通過opengl實現一個立方體&#xff0c;那么這篇我們來學習光照。 風氏光照模型的主要結構由3個分量組成&#xff1a;環境(Ambient)、漫反射(Diffuse)和鏡面(Specular)光照。下面這張圖展示了這些光照分量看起來的樣子&#xff1a; 1 環境光照(Ambient …