Spring Boot 2.6自定义资源路径无法访问带空格文件名静态文件问题
Spring Boot 2.6+ 自定义静态资源路径特殊字符访问404问题解答
问题背景
集成Spring Web MVC的Spring Boot 2.6.1版本,自定义静态资源映射配置如下:
@Configuration public class MyConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/repo/**") .addResourceLocations("file:///srv/intranet/repo/"); } }
本地/srv/intranet/repo目录下存在foo.txt和foo bar.txt两个文件,通过http://localhost:8080/repo/foo.txt可正常访问无特殊字符的文件,但通过http://localhost:8080/repo/foo%20bar.txt访问带空格的文件时返回404。
将带空格的文件放到默认静态资源目录src/main/resources/static下,可通过http://localhost:8080/foo%20bar.txt正常访问。
差异说明与根因
你没有遗漏配置,该问题是版本特性差异+框架bug共同导致的:
- Spring Boot 2.6.0开始默认使用Spring Framework 5.3引入的
PathPattern作为路径匹配器,替代此前的AntPathMatcher - Spring Boot官方预配置的默认静态资源映射(包含
classpath:/static/等路径)已内置适配逻辑,可正确处理PathPattern模式下的URL编码字符 - 手动通过
addResourceHandler注册的自定义资源映射,在上述版本的PathPattern匹配逻辑中存在缺陷:不会自动对请求路径中的URL编码字符(比如代表空格的%20)做解码处理,导致编码后的请求路径无法匹配到本地带特殊字符的文件名,返回404
解决方案
临时兼容方案
修改配置文件,切回旧版路径匹配器即可恢复正常:
application.properties配置:
spring.mvc.pathmatch.matching-strategy=ant-path-matcher
如果是yml配置:
spring: mvc: pathmatch: matching-strategy: ant-path-matcher
最终修复方案
该bug已在Spring Framework 5.3.21版本正式修复,升级对应版本即可继续使用默认的PathPattern匹配器:
- 如果你使用Spring Boot 2.6.x版本,升级到Spring Boot 2.6.9及以上即可
- 如果你使用Spring Boot 2.7.x版本,升级到Spring Boot 2.7.0及以上即可
内容的提问来源于stack exchange,提问作者aaguilera
相关产品推荐
相关产品推荐

