Spring Boot中Filter对NoHandlerFoundException不生效的解决方法
问题分析与解决方案
原因
默认情况下,Spring在匹配不到请求处理器时,不会主动抛出NoHandlerFoundException,而是直接内部转发到错误页面,这个转发过程不会经过你自定义的Filter执行链,导致HTML压缩Filter无法作用于404错误页面的响应。
解决步骤
1. 全局异常处理器捕获404异常
创建全局异常处理器,捕获NoHandlerFoundException并转发到自定义错误页面,确保请求全程走Filter链:
@ControllerAdvice @Order(HIGHEST_PRECEDENCE) public class NotFoundExceptionHandler { @ExceptionHandler(NoHandlerFoundException.class) public String handleNoHandlerFoundException() { // 可在此添加错误信息传递逻辑 return "error"; } }
2. 修改Spring配置
在application.properties中添加以下配置,让Spring在找不到请求处理器时抛出异常,并关闭默认静态资源映射:
spring.web.resources.add-mappings=false spring.mvc.throw-exception-if-no-handler-found=true
3. 手动注册静态资源处理器
关闭默认静态资源映射后,需要手动注册静态资源的映射规则,避免出现静态资源找不到的警告:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/"); registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/"); // 按需添加其他静态资源路径映射 } }
相关参考
该问题可参考Spring项目的Issue #7653(spring-boot)和#29491(spring-framework)。
内容的提问来源于stack exchange,提问作者user5770200
相关产品推荐
相关产品推荐

