過濾器、監聽器、攔截器的區別

過濾器、監聽器、攔截器的區別

  • 過濾器(filter)、監聽器(Listener)是JavaWeb的三大組件。
  • 而攔截器(Interceptor)是Spring框架中的。

我們主要是要分清除過濾器和攔截器的區別:

  1. 實現原理:過濾器是基于函數回調實現的,而攔截器是基于java的反射機制
  2. 使用范圍:過濾器Filter的使用要依賴于Tomcat等容器,導致它只能在web程序中使用。而攔截器是可以單獨使用的。不僅能應用在web程序中,也可以用于Application、Swing等程序中。
  3. 觸發時機:![[Pasted image 20240602162705.png]]
    ![[Pasted image 20240602162846.png]]
    從圖中我看可以看出,過濾器Filter是在請求進入容器后,但請求進入servlet之前進行預處理的。請求結束返回也是,是在servlet處理完后,返回給前端之前。而攔截器Interceptor是在請求進入servlet后,在進入Controller之前進行預處理的,Controller中渲染了對應的視圖之后請求結束。

執行順序

配置Filter:

package com.qcby.demo.config;import org.springframework.stereotype.Component;import javax.servlet.*;
import java.io.IOException;@Component
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Filter 前置過濾");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Filter 處理中");filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {System.out.println("Filter 后置過濾");}
}

自定義攔截器

package com.qcby.demo.config;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;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 前置攔截");return true;}@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 最終攔截");}
}

配置攔截器

package com.qcby.demo.config;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 MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**") // 設置要攔截的.excludePathPatterns("/test1");// 設置不攔截的}
}

控制器

package com.qcby.demo;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("test")
public class TestController {@GetMapping("/test1")public String test() {return "123456";}
}

項目啟動之后,我們會發現過濾器的init()方法,隨著容器的啟動進行了初始化:
![[Pasted image 20240602182638.png]]

然后瀏覽器訪問對應的端口號:http://localhost:8080/test/test1,會有以下輸出:
![[Pasted image 20240602185048.png]]

這樣就驗證了我們前邊的過濾器和攔截器的觸發順序。
對于攔截器的觸發時機,在只有一個攔截器時:
![[Pasted image 20240602185232.png]]

有多個攔截器時
![[Pasted image 20240602185303.png]]

過濾器的應用場景

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

攔截器的應用場景

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

參考文獻

  • Springboot——攔截器
  • 過濾器 和 攔截器的 6個區別,別再傻傻分不清了

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

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

相關文章

overleaf 寫參考文獻引用

目錄 1、 新建.bib 文件 2、導入引用 3、在文檔中引用參考文獻 4、生成參考文獻列表 1、 新建.bib 文件 在Overleaf項目中,你可以選擇導入現有的 .bib 文件或在項目中創建一個新的 .bib 文件來管理你的參考文獻。 導入.bib 文件: 在項目文件樹中點擊…

11. RBAC權限管理從零到一實現(二)

前端頁面已提交至git https://github.com/SJshenjian/cloud-web默認用戶名密碼admin 1

MySql 數據類型選擇與優化

選擇優化的數據類型 更小的通常更好 一般情況下盡量使用可以正確存儲數據的最小類型。更小的數據類型通常更快,因為它們占用更少的磁盤,內存和CPU緩存,并且處理時需要的CPU周期也更少。但也要確保沒有低估需要存儲值的范圍。 簡單就好 簡單的…

【自然語言處理】【Scaling Law】Observational Scaling Laws:跨不同模型構建Scaling Law

相關博客 【自然語言處理】【Scaling Law】Observational Scaling Laws:跨不同模型構建Scaling Law 【自然語言處理】【Scaling Law】語言模型物理學 第3.3部分:知識容量Scaling Laws 【自然語言處理】Transformer中的一種線性特征 【自然語言處理】【大…

jmeter性能優化之tomcat配置與基礎調優

一、 修改tomcat初始和最大堆內存 進入到/usr/local/tomcat7-8083/bin目錄下,編輯catalina.sh文件,,默認堆內存是600m,初始堆內存和最大堆內存保持一致, 可以更改到本機內存的70%,對于Linux系統&#xff0…

conda創建虛擬環境并激活

1 conda activate base 2 conda creat -n aaa python** 3 conda activate aaa 4 interpreter里面去選擇剛搞好的編譯器 ...../conda.exe

【SpringBoot】四種讀取 Spring Boot 項目中 jar 包中的 resources 目錄下的文件

本文摘要:四種讀取 Spring Boot 項目中 jar 包中的 resources 目錄下的文件 😎 作者介紹:我是程序員洲洲,一個熱愛寫作的非著名程序員。CSDN全棧優質領域創作者、華為云博客社區云享專家、阿里云博客社區專家博主。公粽號&#xf…

【操作系統】Windows平臺捕獲崩潰現場底層原理,附代碼親測MiniDumpWriteDump

MiniDumpWriteDump 是一個Windows API函數,它屬于DbgHelp.dll庫,用于生成程序崩潰時的內存轉儲文件(MiniDump)。這個函數是Windows平臺下用于捕獲程序崩潰時的內存狀態的常用方法之一。以下是MiniDumpWriteDump函數的原理和工作流…

【C++】ios::sync_with_stdio(false) 與 cin.tie(nullptr) 加速 IO

一、前言 之前寫題遇到大數據量(cin、cout 數據量級達到 1e5、1e6 ),因為考慮 IO 性能報錯 TLE,故選擇 scanf、printf 替代 cin、cout,以解決問題。一直以來沒有深入研究其中原因,只知關鍵詞——同步&…

設計模式(十三)行為型模式---命令模式

文章目錄 命令模式簡介結構UML圖具體實現UML圖代碼實現 命令模式簡介 命令模式(command pattern)也叫動作模式或者事務模式。它是將請求(命令)封裝成對象,使得可以用不同的請求對客戶端進行參數化,具體的請…

MD中 面料的物理屬性參數

該圖片是Marvelous Designer軟件中"Fabric Physical Properties"(面料物理屬性)面板的截圖,用于調整面料在彎曲、折疊時的硬度(Buckling Stiffness)。 目標部分解釋了調整Buckling Stiffness的作用:通過調整該百分比值來決定面料角落處的硬度。進入80%的Buckling St…

筆記-anaconda配置Python環境

查看環境 conda env list 創建python name環境,python版本為3.9: conda create -n name python3.9 激活: conda activate name 去掉激活: conda deactivate name 進入pandas目錄: cd D:\學習\pyton\antpy代碼\ant-learn-…

NXP RT1060學習總結 - CANFD功能

1、RT1060-CAN FD功能簡介 這里使用RT1060系列的1064芯片進行開發,測試板是官方提供的開發板;RT1060系列支持3路CAN功能,CAN1和CAN2只能最為普通的CAN外設,支持CAN2.0,而CAN3支持CAN-FD功能;CAN-FD功能這里…

【LeetCode 77. 組合】

1. 題目 2. 分析 本題有個難點在于如何保存深搜得到的結果?總結了一下,深搜處理的代碼,關于返回值有三大類。 第一類:層層傳遞,將最深層的結果傳上來;這類題有:【反轉鏈表】 第二類&#xff1…

域名/子域名接管漏洞

域名/子域名接管漏洞 1.域接管2.子域接管子域接管概述使用BBOT掃描可劫持的子域通過DNS通配符生成子域接管 3.利用子域接管4.子域名接管防御手段 1.域接管 如果您發現某個域名被某個服務使用,但公司已經失去了對其的所有權,您可以嘗試注冊它&#xff08…

默認路由,直接路由,靜態路由,動態路由

對于華為設備,如華為路由器或交換機,設置這些路由類型需要通過設備的管理界面或命令行界面進行配置。以下是一般情況下如何在華為設備上設置這些路由類型的指導: 默認路由: 使用命令行界面(CLI)&#xff0c…

QMatrix詳解

一、定義 QMatrix是Qt框架中的一個類,它表示一個2x3的變換矩陣,通常用于進行二維圖形的幾何變換。這個類允許你對圖形進行平移、縮放、旋轉和剪切等操作。 二、功能 QMatrix的主要功能是提供一個便捷的方式來對二維圖形進行線性變換。通過構建一個變換…

CS和msf的權限傳遞,利用mimikatz抓取win10明文密碼

一、Cobaltstrike的安裝 http://t.csdnimg.cn/yhZin 安裝CobaltStrike,瀏覽博主的上篇文章即可!!! 這里我在自己的本機win11上執行了Client去連接kali中的Server端,直接執行.cmd文件即可!!&…

【vscode】ctrl+shift+end選中以下所有行刪除

總結,ctrlshiftend選中以下所有行 以下由chatgpt生成 在 Visual Studio Code(VS Code)中,如果你想要選中當前光標所在的一行及之后的所有行并刪除它們,可以通過組合鍵操作來實現。這種功能在編輯大型文件時特別有用&am…

【計算機畢業設計】基于SSM++jsp的校園驛站管理系統【源碼+lw+部署文檔】

目錄 第1章 緒論 1.1 課題背景 1.2 課題意義 1.3 研究內容 第2章 開發環境與技術 2.1 MYSQL數據庫 2.2 JSP技術 2.3 SSM框架 第3章 系統分析 3.1 可行性分析 3.1.1 技術可行性 3.1.2 經濟可行性 3.1.3 操作可行性 3.2 系統流程 3.2.1 操作流程 3.2.2 登錄流程 3.2.3 刪除信息流…