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

Spring使用@Filter注解創(chuàng)建自定義過濾器

 更新時間:2023年11月18日 17:02:52   作者:代碼小人物  
Spring 中鮮為人知但非常有用的注解之一是 @Filter,它支持自定義過濾器,下面我們就來深入研究一下如何使用 Spring 的 @Filter 注解來創(chuàng)建自定義過濾器吧

簡介

Spring 框架提供了各種強大的功能來構建健壯且可擴展的應用程序。 Spring 中鮮為人知但非常有用的注解之一是 @Filter,它支持自定義過濾器,可以將其應用于 Spring 應用程序以實現(xiàn)不同的目的,例如日志記錄、身份驗證等。 在這篇文章中,我們將深入研究如何使用 Spring 的 @Filter 注解來創(chuàng)建自定義過濾器。

Spring Filters簡介

過濾器在 Web 開發(fā)中發(fā)揮著至關重要的作用,尤其是在基于 Spring 的 Web 應用程序的上下文中。當我們談論 Spring 時,我們主要集中在依賴注入、AOP(面向切面?編程)和 Data JPA 等功能上,而忽略了一些像Filter這樣的無名英雄。過濾器在許多方面都發(fā)揮了作用,例如安全、日志記錄、轉換以及各種其他類型的預處理和后處理活動。

過濾器在 Web 應用程序中的重要性

如果需要強制執(zhí)行訪問控制(身份驗證和授權)、記錄傳入或輸出的 HTTP 請求和響應,或者在請求和響應正文到達控制器或到達客戶端之前對其進行操作,那么過濾器就發(fā)揮了作用。它們?yōu)闄M切關注點提供了一個集中處理,確保不必在應用程序的多個部分中寫相同的邏輯,從而生成更干凈、更易于維護的代碼。

過濾器如何融入 Spring 生態(tài)系統(tǒng)

在 Spring 生態(tài)系統(tǒng)中,過濾器充當著 Servlet 管道中的攔截器,這意味著它們有權在請求到達控制器之前(預處理)和響應離開控制器之后(后處理)執(zhí)行操作。 Spring 與 Java Servlet 規(guī)范很好地保持一致,因此,您可以在 Spring 應用程序中使用本機 Servlet 過濾器。然而,Spring 更進一步,提供了一種使用注解及其強大的依賴注入功能來定義過濾器的優(yōu)雅方法。

@Filter 有什么作用

Spring 中的 @Filter 注釋(或用于類似目的的自定義注解)用于定義可以注冊并應用于傳入請求的過濾器。它允許您將過濾邏輯與核心應用程序邏輯完全分離,提供一種優(yōu)雅的方式將自定義操作添加到請求-響應周期。使用@Filter,您可以簡潔地表達特定的一段代碼旨在充當過濾器,從而使代碼更易于理解和維護。

Servlet 過濾器與 Spring 過濾器

為什么要使用 Spring 特定的過濾器而不是標準 Servlet 過濾器。雖然 Servlet 過濾器功能強大并且可以完成很多工作,但 Spring 過濾器受益于 Spring 的生態(tài)系統(tǒng),例如它的依賴注入功能,它允許您將 Spring 管理的 bean 直接連接到過濾器類中。這是傳統(tǒng) Servlet 過濾器無法做到的事情。

實踐

在本節(jié)中,我們將著眼于從頭開始設置 Spring Boot 項目,重點關注包含必要的依賴項和配置以支持過濾器的使用。我們將討論兩種設置項目的方法:使用 Spring Initializr 和手動設置。

剖析過濾器

了解過濾器的結構對于充分利用其功能至關重要?;?Spring 的應用程序中的過濾器可以與 Java 的本機 Servlet Filter 保持一致,也可以使用 Spring 的特定功能來實現(xiàn)更加自定義的方法。要掌握過濾器的本質(zhì),就必須探索其核心方法——過濾器鏈,以及如何正確配置過濾器。

過濾器中的核心方法

Spring(或一般的 Java Web 應用程序)中的典型過濾器本質(zhì)上是一個 Java 類,它實現(xiàn)了 javax.servlet 包中的 Filter 接口。該接口定義了三個方法:

init(FilterConfig filterConfig)

該方法在過濾器的生命周期內(nèi)僅被調(diào)用一次。您可以在此處放置初始化邏輯,例如分配資源。 FilterConfig 對象提供對過濾器配置參數(shù)的訪問,您可以使用此對象來獲取 Spring 配置中定義的初始化參數(shù)。

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

這是過濾器的主要邏輯,每次請求響應都會調(diào)用這個方法。ServletRequest和ServletResponse分別表示輸入請求和輸出回復,在此方法中調(diào)用chain.doFilter會將請求和響應傳給過濾器鏈中的下一個實體(過濾器鏈或者目標資源例如控制器)

destory()

當過濾器停止服務或者程序關閉時調(diào)用。通常做的是一些清理資源的工作,例如關閉數(shù)據(jù)庫連接、關閉文件等。

理解FilterChain(過濾器鏈)

過濾器鏈表示是請求和響應經(jīng)過的一系列的的過濾器,就和一根鏈條一樣。過濾器添加到鏈中的順序很重要,如果Filter A修改了請求對象,那么鏈中的下一個Filter B將接收修改后的請求。

如何在Spring中配置Filter

雖然可以使用@Component注解配置Filter class使得sping可以自動檢測并應用,但這會造成過濾器應用到每個請求。為了進行更精細的控制,可以使用 FilterRegistrationBean,這個類可以配置過濾器應用到哪個Url或者Servlet。

下面是示例

@Bean
public FilterRegistrationBean<CustomFilter> loggingFilter() {
    FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();

    registrationBean.setFilter(new CustomFilter());
    registrationBean.addUrlPatterns("/api/*");

    return registrationBean;
}

這個例子中,我們的過濾器只對以api開頭的請求有效。

一個簡單的日志過濾器

為了將所有這些概念聯(lián)系在一起,讓我們回顧一下簡單的日志過濾器示例:

import javax.servlet.*;
import java.io.IOException;

public class LoggingFilter implements Filter {
  
  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    // 初始化
    System.out.println("Logging Filter initialized");
  }
  
  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    System.out.println("Request received at " + new java.util.Date());
    
    chain.doFilter(request, response);
    
    System.out.println("Response sent at " + new java.util.Date());
  }
  
  @Override
  public void destroy() {
    // 清理資源
    System.out.println("Logging Filter destroyed");
  }
}

在這個例子中,實現(xiàn)了三個主要的方法,init()輸出了一些初始化方法,doFilter記錄了請求進來的時間和響應回復的時間,destory()記錄了資源清理的時間。

使用@Filter創(chuàng)建自定義過濾器

使用@Filter注解創(chuàng)建自定義過濾器給程序添加特定的功能是非常有效的,這種自定義過濾器以聲明的方式在特定方法或者路由上應用過濾器,是代碼更加簡介且容易維護。

創(chuàng)建@Filter注解

第一步是創(chuàng)建 @Filter 注解本身。這將是一個標記注解,用于標識哪些控制器或方法應受到過濾器的影響

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Filter {
    String value() default "";
}

創(chuàng)建一個@Filter過濾器類

現(xiàn)在,讓我們創(chuàng)建一個將執(zhí)行實際邏輯的自定義過濾器類。要使用 @Filter 注釋,自定義過濾器類應檢查其是否存在。

import org.springframework.core.annotation.AnnotationUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class CustomFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        
        String path = httpRequest.getRequestURI();
        Class<?> controller = 
        
        if (controller != null && AnnotationUtils.findAnnotation(controller, Filter.class) != null) {
            System.out.println("Custom filter applied");
        }

        chain.doFilter(request, response);
    }
}

注冊自定義過濾器

為了讓自定義過濾器正常工作,我們需要注冊它。您可以使用 Spring 的 FilterRegistrationBean 以編程方式實現(xiàn)。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<CustomFilter> customFilterRegistration() {
        FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();

        registrationBean.setFilter(new CustomFilter());
        registrationBean.addUrlPatterns("/*"); // Apply to all routes

        return registrationBean;
    }
}

通過此配置,自定義過濾器將應用于所有路由。您可以更改 addUrlPatterns 方法參數(shù)來限制應應用過濾器的路由。

使用自定義過濾器注解

現(xiàn)在自定義過濾器和 @Filter 注解已準備就緒,現(xiàn)在可以注解控制器或特定方法。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Filter("Some Value")
public class MyController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

使用場景和最佳實踐

過濾器為 Spring Boot 應用程序提供了強大的自定義功能,并且可以通過多種方式利用它們來滿足不同的需求。下面,我們將介紹一些使用過濾器的常見用例,并研究實施過濾器時要遵循的最佳實踐。

使用場景

認證與授權:過濾器是在允許請求繼續(xù)發(fā)送到控制器之前執(zhí)行身份驗證和授權檢查的理想工具。這可確保只有授權用戶才能訪問應用程序的特定部分。

記錄和監(jiān)控:過濾器可以記錄有關請求和響應的基本信息,例如 IP 地址、標頭、有效負載大小和執(zhí)行時間。這些信息有利于調(diào)試和監(jiān)控。

數(shù)據(jù)轉換: 可以使用過濾器來轉換請求和響應數(shù)據(jù),例如,通過添加默認參數(shù)、執(zhí)行數(shù)據(jù)轉換或使用附加信息豐富響應。

速率限制:過濾器可以通過計算給定時間范圍內(nèi)來自特定客戶端的請求數(shù)量來幫助限制速率,然后根據(jù)這些計數(shù)阻止或允許請求。

最佳實踐

把事情簡單化:過濾器不適合復雜業(yè)務邏輯。它們應該盡可能輕量級,以確保它們不會成為性能瓶頸。

注意過濾器鏈: 永遠記住調(diào)用 chain.doFilter(request, response) 來繼續(xù)執(zhí)行過濾器鏈。否則,請求將被阻止,并且無法到達預期的效果。

執(zhí)行順序: 過濾器注冊和執(zhí)行的順序很重要。如果處理依賴于先前的過濾器,請確保設置順序。

徹底測試 : 過濾器與每個傳入請求和傳出響應交互。因此,嚴格的測試對于確保它們在各種條件下表現(xiàn)出預期的效果至關重要。

利用 Spring 的靈活性: Spring Boot 允許通過多種方式來注冊和應用過濾器。利用這種靈活性來創(chuàng)建模塊化且可維護的代碼。

總結

在這篇文章中,我們了解了在 Spring 應用程序中使用過濾器的要點和復雜性。從了解過濾器的結構到設置 Spring Boot 項目,再到使用專門的 @Filter 注釋創(chuàng)建自定義過濾器,我們涵蓋了很多信息。我們還深入研究了過濾器非常有用的現(xiàn)實用例,以及實施過濾器時要遵循的最佳實踐。

當您開發(fā)和維護 Spring Boot 應用程序時,過濾器提供了一種強大的模塊化方法來處理各種橫切問題,例如日志記錄、身份驗證和數(shù)據(jù)轉換等。了解如何正確實現(xiàn)和使用過濾器可以極大地增強應用程序的功能、安全性和整體質(zhì)量。

以上就是Spring使用@Filter注解創(chuàng)建自定義過濾器的詳細內(nèi)容,更多關于Spring Filter自定義過濾器的資料請關注腳本之家其它相關文章!

相關文章

  • springboot配置logback日志管理過程詳解

    springboot配置logback日志管理過程詳解

    這篇文章主要介紹了springboot配置logback日志管理過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java四位電話號碼的加密方法

    Java四位電話號碼的加密方法

    這篇文章主要為大家詳細介紹了Java四位電話號碼的加密方法,數(shù)據(jù)是四位的整數(shù),在傳遞過程中進行加密,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • SpringBoot事件發(fā)布與監(jiān)聽超詳細講解

    SpringBoot事件發(fā)布與監(jiān)聽超詳細講解

    今天去官網(wǎng)查看spring boot資料時,在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關于SpringBoot事件發(fā)布和監(jiān)聽的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • Elasticsearch8.1中的Script使用實例深入解讀

    Elasticsearch8.1中的Script使用實例深入解讀

    這篇文章主要為大家介紹了Elasticsearch8.1中的Script使用實例深入解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Maven倉庫鏡像配置的方法實現(xiàn)

    Maven倉庫鏡像配置的方法實現(xiàn)

    本文介紹了如何使用Maven倉庫鏡像來加速構建過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • springboot接口返回數(shù)據(jù)類型全面解析

    springboot接口返回數(shù)據(jù)類型全面解析

    這篇文章主要介紹了springboot接口返回數(shù)據(jù)類型問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • java中@DateTimeFormat和@JsonFormat注解的使用

    java中@DateTimeFormat和@JsonFormat注解的使用

    本文主要介紹了java中@DateTimeFormat和@JsonFormat注解的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Java中使用HashMap改進查找性能的步驟

    Java中使用HashMap改進查找性能的步驟

    這篇文章主要介紹了Java中使用HashMap改進查找性能的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • Java數(shù)組轉換為List的四種方式

    Java數(shù)組轉換為List的四種方式

    這篇文章主要介紹了Java開發(fā)技巧數(shù)組轉List的四種方式總結,每種方式結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 關于LocalDateTime使用詳解

    關于LocalDateTime使用詳解

    這篇文章主要介紹了關于LocalDateTime使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論