Spring?Boot中的過(guò)濾器攔截器監(jiān)聽(tīng)器使用技巧匯總
前言
環(huán)境說(shuō)明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
在Web應(yīng)用程序中,我們經(jīng)常需要處理請(qǐng)求和響應(yīng)。有時(shí),我們需要應(yīng)用于所有請(qǐng)求和響應(yīng)的通用邏輯。這就是過(guò)濾器、攔截器和監(jiān)聽(tīng)器的用武之地。它們可以幫助我們?cè)谡?qǐng)求和響應(yīng)被處理之前或之后執(zhí)行一些通用邏輯。
過(guò)濾器
過(guò)濾器是在請(qǐng)求進(jìn)入Servlet容器之前或響應(yīng)離開(kāi)容器之后執(zhí)行的,用于在處理請(qǐng)求或響應(yīng)之前/之后修改它們。 在Spring Boot中,我們可以使用Filter接口實(shí)現(xiàn)一個(gè)過(guò)濾器。以下是一個(gè)示例:
@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ù)處理請(qǐng)求 chain.doFilter(request, response); // 執(zhí)行一些通用邏輯 System.out.println( "Logging Response :{}" + res.getContentType()); } // 省略掉其他方法 }
在上面的示例中,我們定義了一個(gè)名為MyFilter的過(guò)濾器。它將在請(qǐng)求進(jìn)入Servlet容器之前和離開(kāi)容器之后執(zhí)行。我們可以在此處執(zhí)行一些通用邏輯,如記錄請(qǐng)求/響應(yīng)、修改請(qǐng)求/響應(yīng)等。
為了將此過(guò)濾器應(yīng)用于我們的應(yīng)用程序,我們需要將其注冊(cè)到Spring Boot應(yīng)用程序中。我們可以使用@ServletComponentScan注釋自動(dòng)掃描我們的過(guò)濾器。例如:
@SpringBootApplication @ServletComponentScan public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }
攔截器
攔截器與過(guò)濾器類(lèi)似,但它們提供更靈活的方式來(lái)處理請(qǐng)求和響應(yīng)。攔截器只能與Spring MVC一起使用,它們?cè)试S我們?cè)诳刂破魈幚碚?qǐng)求之前或之后執(zhí)行邏輯。 攔截器可以為包含控制器的所有請(qǐng)求執(zhí)行通用邏輯,同時(shí)還可以為每個(gè)控制器或每個(gè)請(qǐng)求執(zhí)行特定邏輯。
在Spring Boot中,我們可以使用HandlerInterceptor接口實(shí)現(xiàn)一個(gè)攔截器。以下是一個(gè)示例:
@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; } // 省略掉其他方法 }
在上面的示例中,我們定義了一個(gè)名為MyInterceptor的攔截器。它將在控制器處理請(qǐng)求之前執(zhí)行。我們可以在此處執(zhí)行一些通用邏輯,如記錄請(qǐng)求、驗(yàn)證請(qǐng)求參數(shù)等。
為了將此攔截器應(yīng)用于我們的應(yīng)用程序,我們需要將其注冊(cè)到Spring Boot應(yīng)用程序中。我們可以使用WebMvcConfigurer接口來(lái)注冊(cè)攔截器。例如:
@Configuration public class AppConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor); } }
在上面的示例中,我們將MyInterceptor添加到攔截器注冊(cè)表中。
監(jiān)聽(tīng)器
監(jiān)聽(tīng)器是在Spring應(yīng)用程序中處理事件的通用機(jī)制。 Spring Boot應(yīng)用程序中的事件可以是Web請(qǐng)求、應(yīng)用程序啟動(dòng)/停止等。 監(jiān)聽(tīng)器可以監(jiān)聽(tīng)這些事件,并在事件發(fā)生時(shí)執(zhí)行一些邏輯。
在Spring Boot中,我們可以使用ApplicationListener接口實(shí)現(xiàn)一個(gè)監(jiān)聽(tīng)器。以下是一個(gè)示例:
@Component public class MyAppListener implements ApplicationListener<ApplicationEvent> { @Override public void onApplicationEvent(ApplicationEvent event) { // 處理事件 System.out.println("Event: " + event.getClass()); } }
在上面的示例中,我們定義了一個(gè)名為MyAppListener的監(jiān)聽(tīng)器。它將在應(yīng)用程序中的任何事件發(fā)生時(shí)執(zhí)行。我們可以在此處執(zhí)行一些邏輯,如記錄事件、修改應(yīng)用程序狀態(tài)等。
為了將此監(jiān)聽(tīng)器應(yīng)用于我們的應(yīng)用程序,我們需要將其注冊(cè)到Spring Boot應(yīng)用程序中。我們可以使用@Component注釋將其定義為組件。
代碼方法介紹
過(guò)濾器
在上面的示例中,我們實(shí)現(xiàn)了一個(gè)名為MyFilter的過(guò)濾器。以下是一些在過(guò)濾器中使用的常見(jiàn)方法:
doFilter:執(zhí)行過(guò)濾器邏輯。可以在此處修改請(qǐng)求和響應(yīng)。
init:初始化過(guò)濾器。在過(guò)濾器實(shí)例化時(shí)調(diào)用。
destroy:銷(xiāo)毀過(guò)濾器。在過(guò)濾器銷(xiāo)毀時(shí)調(diào)用。
攔截器
在上面的示例中,我們實(shí)現(xiàn)了一個(gè)名為MyInterceptor的攔截器。以下是一些在攔截器中使用的常見(jiàn)方法:
preHandle:在控制器處理請(qǐng)求之前執(zhí)行??梢栽诖颂庲?yàn)證請(qǐng)求、記錄請(qǐng)求等。
postHandle:在控制器處理請(qǐng)求之后執(zhí)行,但在響應(yīng)發(fā)送到客戶(hù)端之前??梢栽诖颂幮薷捻憫?yīng)、記錄響應(yīng)等。
afterCompletion:在響應(yīng)發(fā)送到客戶(hù)端之后執(zhí)行??梢栽诖颂幱涗涰憫?yīng)等。
監(jiān)聽(tīng)器
在上面的示例中,我們實(shí)現(xiàn)了一個(gè)名為MyAppListener的監(jiān)聽(tīng)器。以下是一些在監(jiān)聽(tīng)器中使用的常見(jiàn)方法:
onApplicationEvent:處理事件??梢栽诖颂幱涗浭录⑿薷膽?yīng)用程序狀態(tài)等。
優(yōu)缺點(diǎn)
過(guò)濾器(Filter)
優(yōu)點(diǎn):
可以攔截請(qǐng)求和響應(yīng),且處理請(qǐng)求和響應(yīng)方便;
可以對(duì)請(qǐng)求進(jìn)行預(yù)處理和后處理,如字符編碼轉(zhuǎn)換、session管理等;
可以實(shí)現(xiàn)對(duì)特定URL或者路徑進(jìn)行特定的處理和攔截;
可以與Servlet容器無(wú)縫結(jié)合,使用方便。
缺點(diǎn):
無(wú)法獲取Servlet容器的上下文信息;
無(wú)法操作HttpServletRequest和HttpServletResponse對(duì)象,只能讀取其中的信息和設(shè)置信息;
過(guò)濾器只能攔截Servlet請(qǐng)求,不能攔截其他的請(qǐng)求;
過(guò)濾器只能對(duì)請(qǐng)求進(jìn)行處理,無(wú)法對(duì)響應(yīng)進(jìn)行處理;
過(guò)濾器執(zhí)行順序不能保證。
攔截器(Interceptor):
優(yōu)點(diǎn):
可以攔截請(qǐng)求和響應(yīng),且處理請(qǐng)求和響應(yīng)方便;
可以獲取Servlet容器的上下文信息;
可以操作HttpServletRequest和HttpServletResponse對(duì)象;
可以對(duì)請(qǐng)求進(jìn)行預(yù)處理和后處理;
可以實(shí)現(xiàn)對(duì)特定URL或者路徑進(jìn)行特定的處理和攔截;
可以對(duì)Controller方法進(jìn)行權(quán)限控制。
缺點(diǎn):
對(duì)于Servlet容器沒(méi)有直接的支持,需要進(jìn)行額外的配置;
攔截器只能在Spring MVC中使用。
監(jiān)聽(tīng)器(Listener):
優(yōu)點(diǎn):
可以監(jiān)聽(tīng)Servlet容器的生命周期事件,如初始化、銷(xiāo)毀等;
可以監(jiān)聽(tīng)HttpServletRequest和HttpServletResponse對(duì)象的創(chuàng)建和銷(xiāo)毀;
可以實(shí)現(xiàn)對(duì)ServletContext、HttpSession和ServletRequest等對(duì)象的監(jiān)聽(tīng)。
缺點(diǎn):
只能對(duì)事件進(jìn)行監(jiān)聽(tīng),無(wú)法對(duì)請(qǐng)求進(jìn)行處理;
監(jiān)聽(tīng)器執(zhí)行順序不能保證;
監(jiān)聽(tīng)器只對(duì)WEB應(yīng)用程序有效。
三者對(duì)比
過(guò)濾器、攔截器和監(jiān)聽(tīng)器都是用于對(duì)應(yīng)用程序進(jìn)行特定處理的工具,但它們具有不同的工作方式和用途。
過(guò)濾器(Filter)
過(guò)濾器是Servlet規(guī)范中的一種組件,用于攔截Web應(yīng)用程序的請(qǐng)求和響應(yīng),可以對(duì)請(qǐng)求進(jìn)行預(yù)處理,也可以在響應(yīng)被發(fā)送到客戶(hù)端之前對(duì)其進(jìn)行后處理。過(guò)濾器通常用于實(shí)現(xiàn)安全性、日志記錄、壓縮、字符編碼轉(zhuǎn)換等功能。其優(yōu)點(diǎn)是可以在Web容器的級(jí)別上對(duì)請(qǐng)求進(jìn)行統(tǒng)一處理,缺點(diǎn)是只能在Servlet規(guī)范的范圍內(nèi)使用。
攔截器(Interceptor)
攔截器是Spring MVC框架中的一種組件,用于攔截和處理請(qǐng)求和響應(yīng)。與過(guò)濾器不同,攔截器可以在請(qǐng)求被處理前和被處理后執(zhí)行一些其它的邏輯,比如安全性、日志記錄、性能監(jiān)測(cè)、事務(wù)管理等。攔截器可以在Spring MVC框架的任意層級(jí)上使用,其優(yōu)點(diǎn)是靈活性高,缺點(diǎn)是需要在代碼中顯式引用。
監(jiān)聽(tīng)器(Listener)
監(jiān)聽(tīng)器是Java Servlet規(guī)范中的一種組件,用于監(jiān)聽(tīng)Web應(yīng)用程序的事件,比如ServletContext、HttpSession和ServletRequest等事件。它可以在應(yīng)用程序運(yùn)行時(shí)動(dòng)態(tài)地捕獲這些事件,并執(zhí)行一些相應(yīng)的邏輯。其優(yōu)點(diǎn)是能夠監(jiān)聽(tīng)?wèi)?yīng)用程序的各種事件并根據(jù)需要進(jìn)行相應(yīng)的處理,缺點(diǎn)是只能監(jiān)聽(tīng)一些特定的事件。
總結(jié)
過(guò)濾器、攔截器和監(jiān)聽(tīng)器都有其各自的適用場(chǎng)合和優(yōu)缺點(diǎn)。過(guò)濾器適用于對(duì)請(qǐng)求和響應(yīng)進(jìn)行統(tǒng)一處理的場(chǎng)合;攔截器適用于在請(qǐng)求被處理前后執(zhí)行一些其它的邏輯的場(chǎng)合;監(jiān)聽(tīng)器適用于對(duì)應(yīng)用程序的事件進(jìn)行監(jiān)聽(tīng)和處理的場(chǎng)合。
附錄源碼
如上涉及所有源碼均已上傳同步在 「GitHub」,提供給同學(xué)們一對(duì)一參考學(xué)習(xí),輔助你更迅速的掌握。
在Web應(yīng)用程序開(kāi)發(fā)中,過(guò)濾器、攔截器和監(jiān)聽(tīng)器都是常用的工具,用于在處理請(qǐng)求和響應(yīng)之前或之后執(zhí)行特定的邏輯。過(guò)濾器可以在請(qǐng)求進(jìn)入Servlet容器之前或響應(yīng)離開(kāi)容器之后執(zhí)行,攔截器只能與Spring MVC一起使用,在控制器處理請(qǐng)求之前或之后執(zhí)行邏輯,監(jiān)聽(tīng)器可以在應(yīng)用程序中處理事件。三種工具各有優(yōu)缺點(diǎn),使用場(chǎng)景也不一樣。根據(jù)需求選擇適合的工具可以提高開(kāi)發(fā)效率和應(yīng)用程序質(zhì)量。
以上就是Spring Boot中的過(guò)濾器攔截器監(jiān)聽(tīng)器技巧匯總的詳細(xì)內(nèi)容,更多關(guān)于Spring Boot過(guò)濾器攔截器監(jiān)聽(tīng)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot 過(guò)濾器, 攔截器, 監(jiān)聽(tīng)器的具體使用
- SpringBoot使用過(guò)濾器、攔截器和監(jiān)聽(tīng)器的案例代碼(Springboot搭建java項(xiàng)目)
- SpringBoot 過(guò)濾器、攔截器、監(jiān)聽(tīng)器對(duì)比及使用場(chǎng)景分析
- SpringBoot實(shí)現(xiàn)攔截器、過(guò)濾器、監(jiān)聽(tīng)器過(guò)程解析
- spring boot設(shè)置過(guò)濾器、監(jiān)聽(tīng)器及攔截器的方法
- SpringBoot定義過(guò)濾器、監(jiān)聽(tīng)器、攔截器的方法
相關(guān)文章
Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)
相信大家都知道Java解析xml的方法有四種,每種方法都很不錯(cuò),今天通過(guò)本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過(guò)兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧2021-08-08Java實(shí)現(xiàn)從Html文本中提取純文本的方法
今天小編就為大家分享一篇Java實(shí)現(xiàn)從Html文本中提取純文本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05java調(diào)用webservice接口,并解析返回參數(shù)問(wèn)題
這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼
這篇文章主要介紹了Spring動(dòng)態(tài)配置計(jì)時(shí)器觸發(fā)時(shí)間的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06idea項(xiàng)目debug模式無(wú)法啟動(dòng)的解決
這篇文章主要介紹了idea項(xiàng)目debug模式無(wú)法啟動(dòng)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02