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

Tomcat 10部署War包出现Filter注册失败问题求助

解决Spring Boot 3.1.2 War包部署Tomcat 10.1.12时ErrorPageFilter重复注册问题

核心原因

Spring Boot的ErrorPageFilter在内嵌Tomcat环境下会自动注册以处理错误页面,但部署到外部Tomcat时,若配置不当或依赖冲突,会导致该过滤器被多次注册,从而触发日志中的错误提示。

分步解决方案

1. 确保War包打包配置正确

首先检查pom.xml中内嵌Tomcat的依赖配置,必须将其标记为provided(仅编译时使用,不打入War包):

<!-- 移除内嵌Tomcat的默认依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 提供外部Tomcat兼容的Tomcat依赖,scope设为provided -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

同时,启动类必须继承SpringBootServletInitializer并重写configure方法,确保外部Tomcat能正确加载Spring Boot应用:

@SpringBootApplication
public class YourApplication extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(YourApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

2. 显式禁用重复的ErrorPageFilter

由于外部Tomcat本身具备错误页面处理能力,可直接禁用Spring Boot的ErrorPageFilter,避免重复注册:

方式一:通过配置类禁用

新增配置类显式禁用该过滤器的注册:

@Configuration
public class FilterRegistrationConfig {
    @Bean
    public ErrorPageFilter errorPageFilter() {
        return new ErrorPageFilter();
    }

    @Bean
    public FilterRegistrationBean<ErrorPageFilter> disableErrorPageFilter(ErrorPageFilter filter) {
        FilterRegistrationBean<ErrorPageFilter> registrationBean = new FilterRegistrationBean<>(filter);
        registrationBean.setEnabled(false);
        return registrationBean;
    }
}

方式二:排除错误页面自动配置类

在启动类上排除ErrorMvcAutoConfiguration,彻底关闭Spring Boot的错误页面自动配置:

@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class)
public class YourApplication extends SpringBootServletInitializer {
    // ... 原有代码
}

3. 检查Security过滤器的注册逻辑

检查你的SecurityConfig中JWT过滤器(JwtAuthorizationFilter)的注册方式,避免手动重复注册:

  • 确保仅通过Spring Security的addFilterBefore/addFilterAfter方法注册过滤器,不要同时使用FilterRegistrationBean手动注册该过滤器:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    private final JwtUtil jwtUtil;
    private final UsersService usersService;

    public SecurityConfig(JwtUtil jwtUtil, UsersService usersService) {
        this.jwtUtil = jwtUtil;
        this.usersService = usersService;
    }

    @Bean
    public JwtAuthorizationFilter jwtAuthorizationFilter() {
        return new JwtAuthorizationFilter(jwtUtil, usersService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // ... 其他安全配置
            .addFilterBefore(jwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
    }
}

4. 排查第三方依赖冲突

若上述步骤无效,检查是否存在第三方依赖(如监控、日志组件)也注册了ErrorPageFilter。可通过mvn dependency:tree命令分析依赖树,排除重复引入的相关依赖。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:17