1. 概述
在本快速教程中,我們將利用 Spring Boot 來探索如何定義自定義過濾器以及指定它們的調用順序。
2. 定義過濾器和調用順序
讓我們先創建兩個過濾器:
- TransactionFilter – 用於啓動和提交事務
- 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 應用程序中定義自定義過濾器。