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
相关产品推荐
相关产品推荐

