知識庫 / Spring / Spring Boot RSS 訂閱

如何定義 Spring Boot 過濾器?

Spring Boot
HongKong
5
02:03 PM · Dec 06 ,2025

1. 概述

在本快速教程中,我們將利用 Spring Boot 來探索如何定義自定義過濾器以及指定它們的調用順序。

2. 定義過濾器和調用順序

讓我們先創建兩個過濾器:

  1. TransactionFilter – 用於啓動和提交事務
  2. RequestResponseLoggingFilter – 用於記錄請求和響應

為了創建過濾器,我們只需要實現 Filter 接口:

@Component
@Order(1)
public class TransactionFilter implements Filter {

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws ServletException {
 
        HttpServletRequest req = (HttpServletRequest) request;
        LOG.info(
          "Starting a transaction for req : {}", 
          req.getRequestURI());
 
        chain.doFilter(request, response);
        LOG.info(
          "Committing a transaction for req : {}", 
          req.getRequestURI());
    }

    // other methods 
}

@Component
@Order(2)
public class RequestResponseLoggingFilter implements Filter {

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) throws ServletException {
 
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        LOG.info(
          "Logging Request  {} : {}", req.getMethod(), 
          req.getRequestURI());
        chain.doFilter(request, response);
        LOG.info(
          "Logging Response :{}", 
          res.getContentType());
    }

    // other methods
}

為了使 Spring 識別過濾器,我們需要將其定義為一個帶有 @Component 註解的 Bean。

此外,為了確保過濾器按照正確的順序執行,我們需要使用 @Order 註解。

2.1. 使用 URL 模式過濾

在上面的示例中,我們的過濾器默認已註冊應用於應用程序中的所有 URL。但是,我們有時可能希望過濾器僅應用於特定的 URL 模式。

在這種情況下,我們需要從過濾器的類定義中移除 @Component 註解,並使用 FilterRegistrationBean 進行過濾器的註冊。

@Bean
public FilterRegistrationBean<RequestResponseLoggingFilter> loggingFilter(){
    FilterRegistrationBean<RequestResponseLoggingFilter> registrationBean 
      = new FilterRegistrationBean<>();
        
    registrationBean.setFilter(new RequestResponseLoggingFilter());
    registrationBean.addUrlPatterns("/users/*");
    registrationBean.setOrder(2);
        
    return registrationBean;    
}

請注意,在這種情況下,我們需要顯式地使用 setOrder()方法來設置順序。

現在,過濾器將僅應用於與 /users/*模式匹配的路徑。

要為過濾器設置URL模式,可以使用 addUrlPatterns()setUrlPatterns()方法。

3. 快速示例

現在,讓我們創建一個簡單的端點並向其發送 HTTP 請求:

@RestController
@RequestMapping("/users")
public class UserController {
    
    @GetMapping()
    public List<User> getAllUsers() {
        // ...
    }
}

該應用程序在調用此 API 時記錄如下:

23:54:38 INFO  com.spring.demo.TransactionFilter - Starting Transaction for req :/users
23:54:38 INFO  c.s.d.RequestResponseLoggingFilter - Logging Request  GET : /users
...
23:54:38 INFO  c.s.d.RequestResponseLoggingFilter - Logging Response :application/json;charset=UTF-8
23:54:38 INFO  com.spring.demo.TransactionFilter - Committing Transaction for req :/users

這確認過濾器按照期望的順序被調用。

4. 結論

在本文中,我們總結了如何在 Spring Boot Web 應用程序中定義自定義過濾器。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.