欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Boot中的過濾器攔截器監(jiān)聽器使用技巧匯總

 更新時間:2023年12月06日 09:29:26   作者:bug菌  
本文將介紹在Spring?Boot應(yīng)用程序中使用過濾器、攔截器和監(jiān)聽器的使用技巧,我們將討論它們之間的區(qū)別,以及何時使用它們,我們還將提供代碼示例,以幫助您在自己的應(yīng)用程序中使用它們

前言 

環(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文件和json轉(zhuǎn)換的方法(DOM4j解析)

    相信大家都知道Java解析xml的方法有四種,每種方法都很不錯,今天通過本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧
    2021-08-08
  • 使用Java實(shí)現(xiàn)簽字功能的示例代碼

    使用Java實(shí)現(xiàn)簽字功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)簽字功能,同時支持將簽字圖像保存為PNG格式和將簽字添加到PDF文檔中,感興趣的可以了解下
    2024-02-02
  • Java實(shí)現(xiàn)從Html文本中提取純文本的方法

    Java實(shí)現(xiàn)從Html文本中提取純文本的方法

    今天小編就為大家分享一篇Java實(shí)現(xiàn)從Html文本中提取純文本的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • java調(diào)用webservice接口,并解析返回參數(shù)問題

    java調(diào)用webservice接口,并解析返回參數(shù)問題

    這篇文章主要介紹了java調(diào)用webservice接口,并解析返回參數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring Data Jpa的四種查詢方式詳解

    Spring Data Jpa的四種查詢方式詳解

    這篇文章主要介紹了Spring Data Jpa的四種查詢方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Spring動態(tài)配置計(jì)時器觸發(fā)時間的實(shí)例代碼

    Spring動態(tài)配置計(jì)時器觸發(fā)時間的實(shí)例代碼

    這篇文章主要介紹了Spring動態(tài)配置計(jì)時器觸發(fā)時間的實(shí)例代碼,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • springboot如何讀取sftp的文件

    springboot如何讀取sftp的文件

    這篇文章主要介紹了springboot如何讀取sftp的文件,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 一文搞懂JAVA 枚舉(enum)

    一文搞懂JAVA 枚舉(enum)

    這篇文章主要介紹了JAVA 枚舉(enum)的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java的IO模型、Netty原理解析

    Java的IO模型、Netty原理解析

    Java的I/O是以流的方式進(jìn)行數(shù)據(jù)輸入輸出的,Java的類庫涉及很多領(lǐng)域的IO內(nèi)容:標(biāo)準(zhǔn)的輸入輸出,文件的操作、網(wǎng)絡(luò)上的數(shù)據(jù)傳輸流、字符串流、對象流等,這篇文章主要介紹了Java的IO模型、Netty原理詳解,需要的朋友可以參考下
    2025-03-03
  • idea項(xiàng)目debug模式無法啟動的解決

    idea項(xiàng)目debug模式無法啟動的解決

    這篇文章主要介紹了idea項(xiàng)目debug模式無法啟動的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論