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

Spring Boot 2.7.x升级至3.2.x后WebFilter在WebFlux中失效

问题分析与解决方案

核心原因

当pom.xml同时引入spring-boot-starter-web(Servlet栈/Spring MVC)和spring-boot-starter-webflux(Reactive栈/Spring WebFlux)时,Spring Boot 3.x会优先启动Servlet栈环境。而WebFilter是Reactive栈专属的过滤器组件,在Servlet环境下不会被Spring容器加载和调用——这就是升级后Filter失效的根本原因。

至于Spring Boot 2.7.x时能正常工作,大概率是旧版本自动配置逻辑存在模糊兼容,升级后该逻辑被明确强化,导致原有行为不再生效。

两种解决方案

方案一:切换为Reactive Web环境,保留WebFilter

如果你的业务更适配响应式编程,可选择完全切换到WebFlux栈:

  1. 移除spring-boot-starter-web依赖,仅保留spring-boot-starter-webflux。
  2. 适配API代码到WebFlux环境:
    • 注解式控制器(@Controller/@RestController)需返回Mono/Flux等响应式类型。
    • 函数式路由需使用RouterFunction等WebFlux专属路由组件。
  3. (可选)强制指定Web应用类型,在application.properties中添加:
    spring.main.web-application-type=reactive
    

方案二:保留Servlet Web环境,替换为Servlet Filter

如果需要继续使用Spring MVC栈(API依赖Servlet环境),需将Reactive过滤器替换为Servlet标准过滤器:

  1. 保留spring-boot-starter-web依赖,确保API正常运行。
  2. 修改MyFilter实现jakarta.servlet.Filter(Spring Boot 3.x使用Jakarta EE API,替代旧版javax):
    import jakarta.servlet.*;
    import jakarta.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    // 用@WebFilter指定拦截路径
    @WebFilter(urlPatterns = "/*")
    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            // 迁移原WebFilter的逻辑到此处
            chain.doFilter(request, response);
        }
    }
    
  3. 若未使用@WebFilter,可通过配置类手动注册Filter:
    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<MyFilter> myFilterRegistration() {
            FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();
            registration.setFilter(new MyFilter());
            registration.addUrlPatterns("/*");
            registration.setOrder(1); // 数字越小,过滤器优先级越高
            return registration;
        }
    }
    

注意:Spring Boot不推荐同时混用Servlet和Reactive两个Web栈,建议根据业务需求选择其中一种,避免依赖冲突和环境混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:07:36