You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:45:23