方式1、 实现 Filter
接口并使用 @WebFilter
注解
适用于Servlet API项目
import jakarta.servlet.annotation.WebFilter;
@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class TokenFilter implements Filter {
// 实现doFilter方法,添加过滤逻辑
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// ... 过滤器逻辑
chain.doFilter(request, response);
}
// 其他生命周期方法如init和destroy...
}
方式2、使用Spring的FilterRegistrationBean
(推荐)
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 写法1
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<TokenFilter> tokenFilterRegistration() {
FilterRegistrationBean<TokenFilter> registration = new FilterRegistrationBean<>();
registration.setFilter(new TokenFilter());
// 设置拦截规则
registration.addUrlPatterns("/*"); // 拦截所有请求
// 可以设置过滤器名称、初始化参数等
registration.setName("tokenFilter");
// 设置过滤器执行顺序,默认为0,数值越小优先级越高
registration.setOrder(1);
return registration;
}
}
// 写法2
// 注册到Spring容器中
@Configuration
public class FilterConfig {
@Bean
public TokenFilter tokenFilter() {
return new TokenFilter();
}
// 若需指定URL模式或排序,同样可以使用FilterRegistrationBean
@Bean
public FilterRegistrationBean<TokenFilter> tokenFilterRegistration(TokenFilter tokenFilter) {
FilterRegistrationBean<TokenFilter> registration = new FilterRegistrationBean<>(tokenFilter);
registration.addUrlPatterns("/*");
registration.setOrder(1);
return registration;
}
}
// TokenFilter类实现javax.servlet.Filter接口
public class TokenFilter implements Filter {
// ...
}
方式3、 定义为 Spring Bean 并手动配置到 Servlet 容器中
import javax.servlet.*;
import java.io.IOException;
public class MyCustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑...
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 过滤逻辑...
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁逻辑...
}
}
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CustomWebAppInitializer extends SpringBootServletInitializer implements ServletContextInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class); // 替换为你的Spring Boot主类名
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// 注册过滤器
FilterRegistration.Dynamic myFilter = servletContext.addFilter("myFilter", new MyCustomFilter());
myFilter.addMappingForUrlPatterns(null, false, "/*"); // 设置过滤所有请求
// 可以设置初始化参数等其他属性
}
}
总结
方式3 通常在需要部署为WAR包
到非嵌入式Servlet容器时采用。而在大多数Spring Boot应用中,建议使用前两种注册过滤器的方式(即通过 @WebFilter
或者 FilterRegistrationBean
),它们与Spring Boot的约定优于配置原则更加契合。