在 Spring Boot 项目中,@WebFilter 注解的过滤器不生效通常是因为 Spring Boot 的自动配置机制没有自动识别该过滤器。默认情况下,Spring Boot 并不会自动注册使用 @WebFilter 注解的过滤器。为了解决这个问题,您需要做以下几步:

1. 确保使用 @WebFilter 注解的过滤器类正确配置

首先,确保您创建的过滤器类使用了 @WebFilter 注解,并且它已正确实现 Filter 接口。例如:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(urlPatterns = "/api/*")
public class MyFilter 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 " + System.currentTimeMillis());
        
        // 继续请求链
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁
    }
}

在上面的代码中,@WebFilter(urlPatterns = "/api/*") 指定了该过滤器应该作用的 URL 模式。

2. 通过 FilterRegistrationBean 注册过滤器

Spring Boot 默认并不会自动识别 @WebFilter 注解。为了让 Spring Boot 知道这个过滤器并自动注册它,您需要通过 FilterRegistrationBean 手动注册过滤器。

你可以在配置类中创建一个 @Bean 来注册该过滤器。

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<MyFilter> loggingFilter() {
        FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new MyFilter());
        registrationBean.addUrlPatterns("/api/*"); // 设置过滤的路径
        registrationBean.setOrder(1); // 设置过滤器的执行顺序,数字越小优先级越高
        return registrationBean;
    }
}

这里,FilterRegistrationBean 被用来手动注册 MyFilter,并且指定了它作用的 URL 模式(/api/*)。

3. 确保正确配置 @ServletComponentScan

如果您希望使用 @WebFilter 注解自动扫描并注册过滤器,还需要在您的 Spring Boot 应用启动类上添加 @ServletComponentScan 注解。这个注解告诉 Spring Boot 自动扫描 @WebFilter@WebListener 和 @WebServlet注解的组件。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan  // 扫描 @WebFilter 和 @WebServlet 注解的组件
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4. 确认 WebFilter 注解的作用域

确保 @WebFilter 注解的 urlPatterns 配置正确,并且匹配您需要的 URL。urlPatterns 可以是单一路径,也可以是多个路径或路径模式。

例如:

@WebFilter(urlPatterns = {"/api/*", "/admin/*"})

总结:

  1. 使用 @WebFilter 注解定义过滤器类。
  2. 在 Spring Boot 配置类中手动注册过滤器,使用 FilterRegistrationBean
  3. 添加 @ServletComponentScan 注解到主应用类,确保 Spring Boot 扫描到 @WebFilter 注解。
  4. 确保过滤器的 urlPatterns 配置正确。

通过以上步骤,您应该能够让 Spring Boot 项目中的 @WebFilter 注解的过滤器正常生效。