Spring?Boot中的過濾器攔截器監(jiān)聽器使用技巧匯總
前言
環(huán)境說明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
在Web應(yīng)用程序中,我們經(jīng)常需要處理請求和響應(yīng)。有時,我們需要應(yīng)用于所有請求和響應(yīng)的通用邏輯。這就是過濾器、攔截器和監(jiān)聽器的用武之地。它們可以幫助我們在請求和響應(yīng)被處理之前或之后執(zhí)行一些通用邏輯。
過濾器
過濾器是在請求進(jìn)入Servlet容器之前或響應(yīng)離開容器之后執(zhí)行的,用于在處理請求或響應(yīng)之前/之后修改它們。 在Spring Boot中,我們可以使用Filter接口實(shí)現(xiàn)一個過濾器。以下是一個示例:
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 執(zhí)行一些通用邏輯
System.out.println(
"Logging Request {} : {}" + req.getMethod() + " " +
req.getRequestURI());
// 繼續(xù)處理請求
chain.doFilter(request, response);
// 執(zhí)行一些通用邏輯
System.out.println(
"Logging Response :{}" +
res.getContentType());
}
// 省略掉其他方法
}在上面的示例中,我們定義了一個名為MyFilter的過濾器。它將在請求進(jìn)入Servlet容器之前和離開容器之后執(zhí)行。我們可以在此處執(zhí)行一些通用邏輯,如記錄請求/響應(yīng)、修改請求/響應(yīng)等。
為了將此過濾器應(yīng)用于我們的應(yīng)用程序,我們需要將其注冊到Spring Boot應(yīng)用程序中。我們可以使用@ServletComponentScan注釋自動掃描我們的過濾器。例如:
@SpringBootApplication
@ServletComponentScan
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}攔截器
攔截器與過濾器類似,但它們提供更靈活的方式來處理請求和響應(yīng)。攔截器只能與Spring MVC一起使用,它們允許我們在控制器處理請求之前或之后執(zhí)行邏輯。 攔截器可以為包含控制器的所有請求執(zhí)行通用邏輯,同時還可以為每個控制器或每個請求執(zhí)行特定邏輯。
在Spring Boot中,我們可以使用HandlerInterceptor接口實(shí)現(xiàn)一個攔截器。以下是一個示例:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 執(zhí)行一些通用邏輯
System.out.println(
"Logging Request {} : {}" +
request.getMethod() + " " + request.getRequestURI());
return true;
}
// 省略掉其他方法
}在上面的示例中,我們定義了一個名為MyInterceptor的攔截器。它將在控制器處理請求之前執(zhí)行。我們可以在此處執(zhí)行一些通用邏輯,如記錄請求、驗(yàn)證請求參數(shù)等。
為了將此攔截器應(yīng)用于我們的應(yīng)用程序,我們需要將其注冊到Spring Boot應(yīng)用程序中。我們可以使用WebMvcConfigurer接口來注冊攔截器。例如:
@Configuration
public class AppConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor);
}
}在上面的示例中,我們將MyInterceptor添加到攔截器注冊表中。
監(jiān)聽器
監(jiān)聽器是在Spring應(yīng)用程序中處理事件的通用機(jī)制。 Spring Boot應(yīng)用程序中的事件可以是Web請求、應(yīng)用程序啟動/停止等。 監(jiān)聽器可以監(jiān)聽這些事件,并在事件發(fā)生時執(zhí)行一些邏輯。
在Spring Boot中,我們可以使用ApplicationListener接口實(shí)現(xiàn)一個監(jiān)聽器。以下是一個示例:
@Component
public class MyAppListener
implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
// 處理事件
System.out.println("Event: " + event.getClass());
}
}在上面的示例中,我們定義了一個名為MyAppListener的監(jiān)聽器。它將在應(yīng)用程序中的任何事件發(fā)生時執(zhí)行。我們可以在此處執(zhí)行一些邏輯,如記錄事件、修改應(yīng)用程序狀態(tài)等。
為了將此監(jiān)聽器應(yīng)用于我們的應(yīng)用程序,我們需要將其注冊到Spring Boot應(yīng)用程序中。我們可以使用@Component注釋將其定義為組件。
代碼方法介紹
過濾器
在上面的示例中,我們實(shí)現(xiàn)了一個名為MyFilter的過濾器。以下是一些在過濾器中使用的常見方法:
doFilter:執(zhí)行過濾器邏輯??梢栽诖颂幮薷恼埱蠛晚憫?yīng)。
init:初始化過濾器。在過濾器實(shí)例化時調(diào)用。
destroy:銷毀過濾器。在過濾器銷毀時調(diào)用。
攔截器
在上面的示例中,我們實(shí)現(xiàn)了一個名為MyInterceptor的攔截器。以下是一些在攔截器中使用的常見方法:
preHandle:在控制器處理請求之前執(zhí)行??梢栽诖颂庲?yàn)證請求、記錄請求等。
postHandle:在控制器處理請求之后執(zhí)行,但在響應(yīng)發(fā)送到客戶端之前??梢栽诖颂幮薷捻憫?yīng)、記錄響應(yīng)等。
afterCompletion:在響應(yīng)發(fā)送到客戶端之后執(zhí)行??梢栽诖颂幱涗涰憫?yīng)等。
監(jiān)聽器
在上面的示例中,我們實(shí)現(xiàn)了一個名為MyAppListener的監(jiān)聽器。以下是一些在監(jiān)聽器中使用的常見方法:
onApplicationEvent:處理事件??梢栽诖颂幱涗浭录⑿薷膽?yīng)用程序狀態(tài)等。
優(yōu)缺點(diǎn)
過濾器(Filter)
優(yōu)點(diǎn):
可以攔截請求和響應(yīng),且處理請求和響應(yīng)方便;
可以對請求進(jìn)行預(yù)處理和后處理,如字符編碼轉(zhuǎn)換、session管理等;
可以實(shí)現(xiàn)對特定URL或者路徑進(jìn)行特定的處理和攔截;
可以與Servlet容器無縫結(jié)合,使用方便。
缺點(diǎn):
無法獲取Servlet容器的上下文信息;
無法操作HttpServletRequest和HttpServletResponse對象,只能讀取其中的信息和設(shè)置信息;
過濾器只能攔截Servlet請求,不能攔截其他的請求;
過濾器只能對請求進(jìn)行處理,無法對響應(yīng)進(jìn)行處理;
過濾器執(zhí)行順序不能保證。
攔截器(Interceptor):
優(yōu)點(diǎn):
可以攔截請求和響應(yīng),且處理請求和響應(yīng)方便;
可以獲取Servlet容器的上下文信息;
可以操作HttpServletRequest和HttpServletResponse對象;
可以對請求進(jìn)行預(yù)處理和后處理;
可以實(shí)現(xiàn)對特定URL或者路徑進(jìn)行特定的處理和攔截;
可以對Controller方法進(jìn)行權(quán)限控制。
缺點(diǎn):
對于Servlet容器沒有直接的支持,需要進(jìn)行額外的配置;
攔截器只能在Spring MVC中使用。
監(jiān)聽器(Listener):
優(yōu)點(diǎn):
可以監(jiān)聽Servlet容器的生命周期事件,如初始化、銷毀等;
可以監(jiān)聽HttpServletRequest和HttpServletResponse對象的創(chuàng)建和銷毀;
可以實(shí)現(xiàn)對ServletContext、HttpSession和ServletRequest等對象的監(jiān)聽。
缺點(diǎn):
只能對事件進(jìn)行監(jiān)聽,無法對請求進(jìn)行處理;
監(jiān)聽器執(zhí)行順序不能保證;
監(jiān)聽器只對WEB應(yīng)用程序有效。
三者對比
過濾器、攔截器和監(jiān)聽器都是用于對應(yīng)用程序進(jìn)行特定處理的工具,但它們具有不同的工作方式和用途。
過濾器(Filter)
過濾器是Servlet規(guī)范中的一種組件,用于攔截Web應(yīng)用程序的請求和響應(yīng),可以對請求進(jìn)行預(yù)處理,也可以在響應(yīng)被發(fā)送到客戶端之前對其進(jìn)行后處理。過濾器通常用于實(shí)現(xiàn)安全性、日志記錄、壓縮、字符編碼轉(zhuǎn)換等功能。其優(yōu)點(diǎn)是可以在Web容器的級別上對請求進(jìn)行統(tǒng)一處理,缺點(diǎn)是只能在Servlet規(guī)范的范圍內(nèi)使用。
攔截器(Interceptor)
攔截器是Spring MVC框架中的一種組件,用于攔截和處理請求和響應(yīng)。與過濾器不同,攔截器可以在請求被處理前和被處理后執(zhí)行一些其它的邏輯,比如安全性、日志記錄、性能監(jiān)測、事務(wù)管理等。攔截器可以在Spring MVC框架的任意層級上使用,其優(yōu)點(diǎn)是靈活性高,缺點(diǎn)是需要在代碼中顯式引用。
監(jiān)聽器(Listener)
監(jiān)聽器是Java Servlet規(guī)范中的一種組件,用于監(jiān)聽Web應(yīng)用程序的事件,比如ServletContext、HttpSession和ServletRequest等事件。它可以在應(yīng)用程序運(yùn)行時動態(tài)地捕獲這些事件,并執(zhí)行一些相應(yīng)的邏輯。其優(yōu)點(diǎn)是能夠監(jiān)聽?wèi)?yīng)用程序的各種事件并根據(jù)需要進(jìn)行相應(yīng)的處理,缺點(diǎn)是只能監(jiān)聽一些特定的事件。
總結(jié)
過濾器、攔截器和監(jiān)聽器都有其各自的適用場合和優(yōu)缺點(diǎn)。過濾器適用于對請求和響應(yīng)進(jìn)行統(tǒng)一處理的場合;攔截器適用于在請求被處理前后執(zhí)行一些其它的邏輯的場合;監(jiān)聽器適用于對應(yīng)用程序的事件進(jìn)行監(jiān)聽和處理的場合。
附錄源碼
如上涉及所有源碼均已上傳同步在 「GitHub」,提供給同學(xué)們一對一參考學(xué)習(xí),輔助你更迅速的掌握。
在Web應(yīng)用程序開發(fā)中,過濾器、攔截器和監(jiān)聽器都是常用的工具,用于在處理請求和響應(yīng)之前或之后執(zhí)行特定的邏輯。過濾器可以在請求進(jìn)入Servlet容器之前或響應(yīng)離開容器之后執(zhí)行,攔截器只能與Spring MVC一起使用,在控制器處理請求之前或之后執(zhí)行邏輯,監(jiān)聽器可以在應(yīng)用程序中處理事件。三種工具各有優(yōu)缺點(diǎn),使用場景也不一樣。根據(jù)需求選擇適合的工具可以提高開發(fā)效率和應(yīng)用程序質(zhì)量。
以上就是Spring Boot中的過濾器攔截器監(jiān)聽器技巧匯總的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot過濾器攔截器監(jiān)聽器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java程序結(jié)構(gòu)與常量變量難點(diǎn)解析
JAVA的基本結(jié)構(gòu)就是順序結(jié)構(gòu),除非特別指明,否則就按照順序一句一句執(zhí)行順序結(jié)構(gòu)是最簡單的算法結(jié)構(gòu),語句與語句之間,框與框之間是按從上到下的順序進(jìn)行的,它是由若干個依次執(zhí)行的處理步驟組成的,它是任何一個算法都離不開的一種基本算法結(jié)構(gòu)2021-10-10
解決jackson反序列化失敗InvalidFormatException:Can not dese
這篇文章主要介紹了解決jackson反序列化失敗InvalidFormatException:Can not deserialize value of type java.util.Date問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
接口隔離原則_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了接口隔離原則,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

