Spring Boot 過濾器和攔截器詳解

目錄

    • Spring Boot 過濾器
      • 1.什么是過濾器
      • 2.工作機制
      • 3.實現過濾器
    • Spring Boot 攔截器
      • 1. 什么是攔截器
      • 2. 工作原理
      • 3.實現
      • 4.拓展(MethodInterceptor 攔截器)
        • 實現
    • 過濾器和攔截器區別
    • 過濾器和攔截器應用場景
      • 過濾器
      • 攔截器

Spring Boot 過濾器

在這里插入圖片描述

1.什么是過濾器

  1. 過濾器(Filter),是 Servlet 規范規定的,在 Servlet 前執行的。用于攔截和處理 HTTP 請求和響應,可用于身份認證、授權、日志記錄和設置字符集(CharacterEncodingFilter)等場景。

  2. 過濾器位于整個請求處理流程的最前端,因此在請求到達 Controller 層前,都會先被過濾器處理。

  3. 過濾器可以攔截多個請求或響應,一個請求或響應也可以被多個過濾器攔截。

2.工作機制

Filter 的生命周期對應的三個關鍵方法:

方法作用
init()當請求發起是,會調用init()方法初始化Filter實例,僅初始化一次 ,若設置初始化參數時可調用該方法
doFilter()攔截要執行的請求,對請求和響應進行處理
destroy()請求結束時調用該方法銷毀Filter的實例

3.實現過濾器

  1. 實現 Filter 接口
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 用于完成 Filter 的初始化Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("過濾器已經攔截成功!!!");// 執行該方法之前,即對用戶請求進行預處理;執行該方法之后,即對服務器響應進行后處理。chain.doFilter(request,response);}@Overridepublic void destroy() {// 用于 Filter 銷毀前,完成某些資源的回收;Filter.super.destroy();}
}
  1. 啟動類添加注解 @ServletComponentScan
  2. 通過@Component和@Order(1)注解可以保證過濾器執行順序

Spring Boot 攔截器

1. 什么是攔截器

依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架。在實現上基于Java的反射機制,屬于面向切面編程(AOP)的一種運用。由于攔截器是基于web框架的調用,因此可以使用Spring的依賴注入(DI)進行一些業務操作,同時一個攔截器實例在一個controller生命周期之內可以多次調用。但是缺點是只能對controller請求進行攔截,對其他的一些比如直接訪問靜態資源的請求則沒辦法進行攔截處理。

2. 工作原理

SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法中執行的。所以過濾器、攔截器、service()方法,dispatc()方法的執行順序應該是這樣的
請添加圖片描述

3.實現

配置攔截器,實現WebMvcConfigurer接口,加@Configuration注解并重寫addInterceptors方法。

@Configuration
public class MyWebConfigurer implements WebMvcConfigurer {@Resourceprivate MyHandlerInterceptor myHandlerInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {List<String> patterns = new ArrayList<>();patterns.add("/test/handlerInterceptor");registry.addInterceptor(myHandlerInterceptor).addPathPatterns(patterns) // 需要攔截的請求.excludePathPatterns(); // 不需要攔截的請求}
}

4.拓展(MethodInterceptor 攔截器)

  1. MethodInterceptor 是 AOP 中的攔截器,它攔截的目標是方法,可以不是 Controller 中的方法。

  2. 在對一些普通的方法上的攔截可以使用該攔截器,這是 HandlerInterceptor 無法實現的。

  3. 可用來進行方法級別的身份認證、授權以及日志記錄等,也可基于自定義注解實現一些通用的方法增強功能。

實現

MethodInterceptor 是基于 AOP 實現的,所以根據不同的代理有多種實現方式。

  1. 創建 Interceptor 類,實現MethodInterceptor接口,重寫invoke方法,加@Component注解。
@Component
public class MyMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("進入攔截,方法執行前,攔截方法是:" + invocation.getMethod().getName());Object result = invocation.proceed();System.out.println("方法執行后");return result;}}
  1. 配置自動代理,加@Configuration注解并創建自動代理BeanNameAutoProxyCreator。
@Configuration
public class MyMethodConfigurer {@Resourceprivate MyMethodInterceptor myMethodInterceptor;@Beanpublic BeanNameAutoProxyCreator beanNameAutoProxyCreator() {// 使用BeanNameAutoProxyCreator來創建代理BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();// 指定一組需要自動代理的Bean名稱,Bean名稱可以使用*通配符beanNameAutoProxyCreator.setBeanNames("user*");//設置攔截器名稱,這些攔截器是有先后順序的beanNameAutoProxyCreator.setInterceptorNames("myMethodInterceptor");return beanNameAutoProxyCreator;}}

過濾器和攔截器區別

  1. 過濾器是基于函數回調,攔截器是基于java的反射機制的。

  2. 過濾器是servlet規范規定的,只能用于web程序中,而攔截器是在spring容器中,它不依賴servlet容器。

  3. 過濾器可以攔截幾乎所有的請求(包含對靜態資源的請求),而攔截器只攔截action請求(不攔截靜態資源請求)。

  4. 過濾器不能訪問action上下文、值棧里的對象,攔截器可以訪問action上下文、值棧里的對象。

  5. 在action的生命周期中,過濾器只能在容器初始化時被調用一次,攔截器可以多次被調用,而。

  6. 攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。

  7. 攔截器是被包裹在過濾器之中。

過濾器(Filter) :可以拿到原始的http請求,但是拿不到你請求的控制器和請求控制器中的方法的信息。

攔截器(Interceptor):可以拿到你請求的控制器和方法,卻拿不到請求方法的參數。

切片(Aspect): 可以拿到方法的參數,但是卻拿不到http請求和響應的對象

過濾器和攔截器應用場景

過濾器

  1. 過濾敏感詞匯(防止sql注入)
  2. 設置字符編碼
  3. URL級別的權限訪問控制
  4. 壓縮響應信息

攔截器

  1. 登錄驗證,判斷用戶是否登錄。
  2. 權限驗證,判斷用戶是否有權限訪問資源,如校驗token
  3. 日志記錄,記錄請求操作日志(用戶ip,訪問時間等),以便統計請求訪問量。
  4. 處理cookie、本地化、國際化、主題等。
  5. 性能監控,監控請求處理時長等。
  6. 通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實現)

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

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

相關文章

信創認證 | Smartbi Insight V11成功適配申威3231處理器

在信息技術飛速發展的浪潮中&#xff0c;軟硬件的深度融合與協同發展已成為推動行業創新的關鍵因素。 近日&#xff0c;思邁特商業智能與數據分析軟件[簡稱&#xff1a;Smartbi Insight]V11在統信服務器操作系統V20和中電科申泰信息科技有限公司產品申威3231處理器環境下完成適…

日本職場跳槽漲薪調查報告!原來薪資漲幅的秘訣在這!

看到篇帖子&#xff0c;日本職場跳槽的調查報告&#xff1a; 文章中根據日本大型求職網站doda&#xff0c;通過分析網站注冊會員的數據以及職業顧問的解說&#xff0c;來了解一下跳槽實現工資提升的人基本情況以及趨勢。 本次調查對象跳槽后平均年收入提升了906,274日元&#…

Python 語法基礎一

1.變量 python 中變量很簡單&#xff0c;不需要指定數據類型&#xff0c;直接使用等號定義就好。python變量里面存的是內存地址&#xff0c;也就是這個值存在內存里面的哪個地方&#xff0c;如果再把這個變量賦值給另一個變量&#xff0c;新的變量通過之前那個變量知道那個變量…

《昇思25天學習打卡營第10天 | 昇思MindSporeFCN圖像語義分割》

第10天 本節學習了FCN圖像語義分割。全卷積網絡是用于圖像語義分割的一種框架。FCN是首個端到端&#xff08;end to end&#xff09;進行像素級&#xff08;pixel level&#xff09;預測的全卷積網絡。FCN有兩大明顯的優點&#xff1a;一是可以接受任意大小的輸入圖像&#xff…

【滲透工具】內網多級代理工具Venom詳細使用教程

免責申明 本公眾號的技術文章僅供參考&#xff0c;此文所提供的信息只為網絡安全人員對自己所負責的網站、服務器等&#xff08;包括但不限于&#xff09;進行檢測或維護參考&#xff0c;未經授權請勿利用文章中的技術資料對任何計算機系統進行入侵操作。利用此文所提供的信息…

【LeetCode】九、雙指針算法:環形鏈表檢測 + 救生艇

文章目錄 1、雙指針算法1.1 對撞雙指針1.2 快慢雙指針 2、leetcode141&#xff1a;環形鏈表3、leetcode881&#xff1a;救生艇 1、雙指針算法 用兩個指針來共同解決一個問題&#xff1a; 1.1 對撞雙指針 比如先有一個有序的數組array int[] array {1, 4, 5, 7, 9}先要找兩個…

什么是產線工控安全,如何保障產線設備的安全

什么是產線工控安全&#xff1f; 工控&#xff0c;指的是工業自動化控制&#xff0c;主要利用電子電氣、機械、軟件組合實現。即是工業控制系統&#xff0c;或者是工廠自動化控制。產線工控安全指的是工業控制系統的數據、網絡和系統安全。隨著工業信息化的迅猛發展&#xff0…

如何利用“AI交互數字人+展廳”拓展文娛消費空間?

打造新生代潮玩聚集地&#xff0c;打造演藝新空間&#xff0c;促進虛擬現實體驗等文娛業態場景創新&#xff0c;成為了當下發展文旅消費新場景的一大重要手段。數字人匯集了虛擬現實、增強現實、全息投影、人工智能、實時傳輸語音合成等數字技術&#xff0c;可以利用數字人重構…

SpringBoot項目中獲取IP地址

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言 OkHttp 是一個由 Square 開發的高效、現代的 HTTP 客戶端庫&#xff0c;用于 Android 和 Java 應用程序。它支持 HTTP/2 和 SPDY 等現代網絡協議&#xff0c;…

Jmeter 進行http接口測試

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文主要針對http接口進行測試&#xff0c;使用 jmeter工具實現。 Jmeter工具設計之初是用于做性…

如何用Vue3和Plotly.js繪制動態3D圖表?

本文由ScriptEcho平臺提供技術支持 項目地址&#xff1a;傳送門 Plotly.js: 使用Vue.js動態加載數據并繪制圖表 應用場景 在數據可視化應用中&#xff0c;需要將數據動態加載到圖表中并進行實時更新。本文將展示如何使用Plotly.js和Vue.js實現這一功能&#xff0c;從加載外…

MobPush iOS端海外推送最佳實現

推送注冊 在AppDelegate里進行SDK初始化&#xff08;也可以在Info.plist文件中進行AppKey&#xff0c;AppSecret的配置&#xff09;并對通知功能進行注冊以及設置推送的環境和切換海外服務器等&#xff0c;參考如下步驟代碼&#xff1a; <span style"background-colo…

【深度學習】圖形模型基礎(1):使用潛在變量模型進行數據分析的box循環

1.緒論 探索數據背后的隱藏規律&#xff0c;這不僅是數據分析的藝術&#xff0c;更是概率模型展現其威力的舞臺。在這一過程中&#xff0c;潛在變量模型尤為關鍵&#xff0c;它成為了數據驅動問題解決的核心引擎。潛在變量模型的基本理念在于&#xff0c;那些看似復雜、雜亂無…

又是一篇關于GD32堆棧的梳理+FreeRTOS的空間

GD32F103CB&#xff1a;SRAM 20K&#xff08;0x5000&#xff09; 這篇文章主要想講清楚幾個事情&#xff1a; 1、啟動文件Stack_Size、Heap_Size的大小設置有啥影響&#xff1b; 2、FreeRTOS的內存&#xff1a;FreeRTOSConfig.h文件configTOTAL_HEAP_SIZE&#xff1b; 問題2…

訊飛星火V4.0 發布,全面對標GPT-4 Turbo

6月27日&#xff0c;訊飛星火V4.0如期而至&#xff0c;升級成為更懂你的AI助手。 七大核心能力持續突破&#xff0c;全面對標GPT-4 Turbo。在8個國際主流測試集中排名第一&#xff0c;訊飛星火以一份惹眼的成績單&#xff0c;成為國內大模型的先行者。 發布會現場&#xff0c…

一個簡單易用,跨平臺的通用版本管理器,VMR

項目主頁&#xff1a;https://vdocs.vmr.us.kg/zh-cn/ 歡迎PR&#xff0c;Issue&#xff0c;Star。 類別&#xff1a;Go 項目標題&#xff1a;一個簡單易用&#xff0c;跨平臺卻非常強大的通用版本管理器&#xff0c;VMR 項目描述&#xff1a; 目前各種SDK版本管理器存在以下…

用數組模擬棧實現遞歸函數模擬

做算法課設時候看到題目要求模擬函數遞歸時候棧的入棧出棧過程。本來想著直接調用系統遞歸函數即可&#xff0c;可是發現系統函數棧的空間非常小大約只有3000層&#xff0c;很容易爆棧。于是便有了用棧去模擬遞歸函數的想法&#xff0c;但是上網查了下貌似相關代碼比較少&#…

小馬搬運物品-第13屆藍橋杯省賽Python真題精選

[導讀]&#xff1a;超平老師的Scratch藍橋杯真題解讀系列在推出之后&#xff0c;受到了廣大老師和家長的好評&#xff0c;非常感謝各位的認可和厚愛。作為回饋&#xff0c;超平老師計劃推出《Python藍橋杯真題解析100講》&#xff0c;這是解讀系列的第89講。 小馬搬運物品&…

如何與Honda建立EDI連接?

你是本田Honda的新供應商&#xff0c;需要具備EDI電子數據交換功能嗎&#xff1f;在與本田Honda交換EDI消息時需要幫助嗎&#xff1f;本文將帶你快速了解Honda的EDI需求&#xff0c;明確EDI對接需要完成的工作。 項目背景 本田是一家世界領先的汽車制造商&#xff0c;在全球2…

倉庫選址問題【數學規劃的應用(含代碼)】阿里達院MindOpt

本文主要講述使用MindOpt工具優化倉庫選址的數學規劃問題。 視頻講解&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448;&#x1f448; 一、案例場景 倉庫選址問題在現代物流和供應鏈管理中具有重要的應用。因為倉庫…