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

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

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

相關(guān)文章

  • Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)

    Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)

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

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

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

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

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

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

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

    Spring Data Jpa的四種查詢(xún)方式詳解

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

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

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

    springboot如何讀取sftp的文件

    這篇文章主要介紹了springboot如何讀取sftp的文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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èi)庫(kù)涉及很多領(lǐng)域的IO內(nèi)容:標(biāo)準(zhǔn)的輸入輸出,文件的操作、網(wǎng)絡(luò)上的數(shù)據(jù)傳輸流、字符串流、對(duì)象流等,這篇文章主要介紹了Java的IO模型、Netty原理詳解,需要的朋友可以參考下
    2025-03-03
  • idea項(xiàng)目debug模式無(wú)法啟動(dòng)的解決

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

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

最新評(píng)論