传统 servlet 方式
主类添加 @ServletComponentScan 注解
@SpringBootApplication
@ServletComponentScan(basePackages = "com.xxx.filter")
public class CoreApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(CoreApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ ==CoreApplication== 启动成功 ლ(´ڡ`ლ)゙ ");
}
}
实现 Filter 接口并添加 @WebFilter 注解
@Slf4j
@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("MyFilter doFilter. uri: {}", ((HttpServletRequest) servletRequest).getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
}
这种情况下,Spring Boot会通过 WebFilterHandler 来注册这个过滤器。
@Component 方式
仅添加 @Component 注解(不再需要 @ServletComponentScan 注解和 @WebFilter 注解)
@Slf4j
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("MyFilter doFilter. uri: {}", ((HttpServletRequest) servletRequest).getRequestURI());
filterChain.doFilter(servletRequest, servletResponse);
}
}
这中情况下,Spring 会将这个过滤器类视为一个普通的 Bean。Spring Boot 会检测到这个 Bean 实现了 Filter 接口,并通过 FilterRegistrationBean 来注册这个过滤器到Servlet容器中。这种方式不依赖于 @WebFilter 注解,而是通过 Spring 的组件扫描机制来发现和注册过滤器。在这种情况下,过滤器的调用会直接由 Tomcat 的 ApplicationFilterChain 处理,因为它已经被注册到了 Servlet 容器的过滤器链中。