SpringBootApplication中Filter无法生效,请求排查问题
Spring Boot Filter未生效问题排查与解决
核心问题分析
你的Filter未生效,主要有两个关键原因需要优先排查:
1. Jakarta EE与Java EE包冲突(Spring Boot 3.x版本必现)
Spring Boot 3.x基于Jakarta EE 9+,但你的Filter导入的是javax.servlet.Filter(Java EE旧包),Spring Boot 3无法识别这个包下的Filter接口,导致组件无法被正确注册为Servlet Filter。
修正代码:
将Filter类的导入替换为Jakarta EE的包:
package com.foo.core; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import jakarta.servlet.*; // 替换javax为jakarta import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; @Component @Order(0) public class AuthorizationRequiredFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(AuthorizationRequiredFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("doFilter() method is invoked"); // 先改用info级别,避免日志级别问题 HttpServletRequest httpRequest = (HttpServletRequest) request; System.out.println(httpRequest.getHeader("Authorization")); chain.doFilter(request, response); } @Override public void destroy() {} }
2. 日志级别配置问题
你的代码中使用log.debug()输出日志,但Spring Boot默认日志级别为INFO,DEBUG级别的日志会被屏蔽,导致你看不到日志输出,但Filter可能已经在执行。
临时验证/解决:
- 把
log.debug()改为log.info(),直接查看INFO级别的日志。 - 或者在
application.properties中添加日志级别配置:logging.level.com.foo.core=DEBUG
额外验证方案:显式注册Filter
如果上述修正后仍有问题,可以通过FilterRegistrationBean显式注册Filter,确保覆盖所有端点:
package com.foo.core; 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<AuthorizationRequiredFilter> authorizationFilterRegistration(AuthorizationRequiredFilter filter) { FilterRegistrationBean<AuthorizationRequiredFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); // 指定对所有路径生效 registrationBean.setOrder(0); return registrationBean; } }
其他排查点
- 确认组件扫描范围:
@SpringBootApplication默认扫描主类(com.foo.core.Main)所在包及其子包,你的Filter和Controller都在扫描范围内,无需额外配置。 - 清理冗余依赖:pom.xml中
javax.persistence依赖可以移除,Spring Boot 3.x已经使用Jakarta Persistence,该依赖会导致冲突。
内容的提问来源于stack exchange,提问作者Alexey
相关产品推荐
相关产品推荐

