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

Spring自定义Filter未生效求助:JWT实现遇阻

Spring JWT过滤器未生效的排查与解决

以下是针对过滤器未生效问题的具体排查步骤和解决方案:

1. 确保过滤器被Spring容器扫描到

  • 检查Filtro类所在的包是否在Spring Boot主启动类的@ComponentScan扫描范围内。主启动类默认扫描自身所在包及其子包,若过滤器在外部包,需手动指定扫描路径。

2. 修复doFilter方法的逻辑

当前代码未调用chain.doFilter(request, response),即便过滤器生效,请求也无法传递到后续控制器。同时确保日志代码正确:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    log.info("ENTRY::-> doFilter");
    // 必须调用此方法,保证请求继续流转
    chain.doFilter(request, response);
}

3. 显式配置拦截路径

仅依赖@Component可能因环境差异导致拦截路径不生效,推荐以下两种方式明确配置:

方式一:使用@WebFilter + @ServletComponentScan

在过滤器类上添加@WebFilter指定拦截路径,主启动类添加@ServletComponentScan开启Servlet组件扫描:

@Slf4j
@WebFilter(urlPatterns = "/*")
public class Filtro implements Filter {
    // 实现方法
}

// 主启动类
@SpringBootApplication
@ServletComponentScan
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

方式二:通过配置类手动注册过滤器

创建配置类,明确指定过滤器的拦截路径和优先级:

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<Filtro> filtroRegistrationBean() {
        FilterRegistrationBean<Filtro> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new Filtro());
        // 拦截所有请求
        registrationBean.addUrlPatterns("/*");
        // 设置优先级,数字越小优先级越高
        registrationBean.setOrder(1);
        return registrationBean;
    }
}

此方式无需在过滤器类上添加@Component,避免自动扫描的不确定性。

4. 检查日志级别配置

确保日志配置中开启了INFO级别输出,例如在application.yml中:

logging:
  level:
    com.yourpackage: INFO # 替换为Filtro类所在的包路径

若日志级别设为WARN或ERROR,log.info的内容将不会输出。

5. 处理Spring Security冲突(若使用)

如果项目集成了Spring Security,自定义过滤器需加入SecurityFilterChain才能生效,否则请求会被Security的过滤器优先拦截:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
            // 将自定义过滤器添加到UsernamePasswordAuthenticationFilter之前
            .addFilterBefore(new Filtro(), UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
}

内容的提问来源于stack exchange,提问作者Manuel Quintero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:43:12