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解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)
相信大家都知道Java解析xml的方法有四種,每種方法都很不錯,今天通過本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧2021-08-08Java實(shí)現(xiàn)從Html文本中提取純文本的方法
今天小編就為大家分享一篇Java實(shí)現(xiàn)從Html文本中提取純文本的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05java調(diào)用webservice接口,并解析返回參數(shù)問題
這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Spring動態(tài)配置計(jì)時器觸發(fā)時間的實(shí)例代碼
這篇文章主要介紹了Spring動態(tài)配置計(jì)時器觸發(fā)時間的實(shí)例代碼,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06