在 Spring MVC 中,可以通过实现 WebMvcConfigurer
接口来配置各种 Web MVC 相关的设置。虽然 WebMvcConfigurer
主要用于配置拦截器、视图解析器等,但添加过滤器通常是通过 FilterRegistrationBean
或 @Bean
注解来完成的。
以下是如何在 Spring Boot 应用程序中添加过滤器的几种方法:
方法一:使用 FilterRegistrationBean
FilterRegistrationBean
是 Spring 提供的一个类,用于注册和配置过滤器。
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public FilterRegistrationBean<CustomFilter> loggingFilter() {
FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CustomFilter());
registrationBean.addUrlPatterns("/api/*");
return registrationBean;
}
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化代码
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 过滤器逻辑
System.out.println("Request received at " + request.getRemoteAddr());
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁代码
}
}
}
方法二:使用 @Component
注解
你也可以直接将过滤器类标记为 Spring 组件,并使用 @Component
注解进行注册。
import org.springframework.stereotype.Component;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化代码
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 过滤器逻辑
System.out.println("Request received at " + request.getRemoteAddr());
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁代码
}
}
方法三:使用 @ServletComponentScan
注解
如果你希望通过注解扫描来注册过滤器,可以使用 @ServletComponentScan
注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然后在过滤器类上使用 @WebFilter
注解:
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(urlPatterns = "/api/*")
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化代码
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 过滤器逻辑
System.out.println("Request received at " + request.getRemoteAddr());
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁代码
}
}
总结
FilterRegistrationBean
:通过 Java 配置类注册过滤器,适用于需要精细控制过滤器顺序和 URL 模式的场景。@Component
注解:直接将过滤器类标记为 Spring 组件,适用于简单的过滤器注册。@ServletComponentScan
和@WebFilter
注解:通过注解扫描注册过滤器,适用于需要通过注解配置过滤器的场景。