为何自定义LoggerFilter无法捕获Postman的GET请求?
问题分析
你的LoggerFilter类已添加@Component注解,但doFilter方法未被调用,核心原因是过滤器的注册范围未覆盖目标请求路径,或者Spring Boot的自动注册逻辑未正确识别该过滤器的生效范围。
解决方案
方案1:用@WebFilter指定拦截路径并开启组件扫描
- 在LoggerFilter类上添加
@WebFilter注解,明确拦截所有请求路径:
package FirstTest.demo.Controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import java.io.IOException; @WebFilter(urlPatterns = "/*") public class LoggerFilter implements Filter{ private static final Logger logger = LoggerFactory.getLogger(LoggerFilter.class); @Override public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException { if(request instanceof HttpServletRequest){ var httpRequest = (HttpServletRequest) request; logger.info("[doFilter]" + httpRequest.getMethod() + " " + httpRequest.getRequestURI()); } filterChain.doFilter(request, servletResponse); } }
- 在Spring Boot启动类上添加
@ServletComponentScan,让Spring扫描并注册Servlet相关组件:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @ServletComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
方案2:通过FilterRegistrationBean手动注册过滤器
如果不想用@WebFilter,可以通过配置类手动注册,精确控制拦截规则:
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<LoggerFilter> loggerFilterRegistration() { FilterRegistrationBean<LoggerFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new LoggerFilter()); // 拦截所有请求,可按需修改为特定路径如"/api/*" registrationBean.addUrlPatterns("/*"); // 设置优先级,数值越小优先级越高 registrationBean.setOrder(1); return registrationBean; } }
此时可以去掉LoggerFilter类上的@Component注解,避免重复注册。
额外排查点
- 确认请求路径是否在过滤器拦截范围内:若过滤器默认仅拦截特定路径,而你的请求不在其中,就不会触发
doFilter。 - 检查是否有其他优先级更高的过滤器未调用
filterChain.doFilter(request, servletResponse):这类情况会直接终止过滤器链,导致后续过滤器无法执行。
内容的提问来源于stack exchange,提问作者Tomasz Piszczek
相关产品推荐
相关产品推荐

