spring boot静态资源访问需配置url路径规则和文件查找位置,可通过application.yml设置spring.mvc.static-path-pattern和spring.web.resources.static-locations,或用@configuration类实现webmvcconfigurer自定义映射。

Spring Boot 默认就能访问静态资源,但要让它按你想要的方式工作,关键在于搞清楚两件事:访问的 URL 路径规则(前端怎么写地址),以及后端实际去哪找文件(磁盘或类路径位置)。配置方式主要有两种:改配置文件,或者写 Java 配置类。
通过 application.yml 直接配置
这是最轻量、适合多数场景的方式。主要用两个属性:
-
spring.mvc.static-path-pattern:定义浏览器访问静态资源时的 URL 前缀,比如设为
/res/**,那么http://localhost:8080/res/logo.png就会触发静态资源查找;默认是/**,所以直接/logo.png就能访问。 -
spring.web.resources.static-locations:指定 Spring Boot 去哪些地方找文件。支持
classpath:(jar 包内)和file:(服务器本地磁盘)两种前缀,多个路径用逗号分隔。例如:
spring:
mvc:
static-path-pattern: /res/**
web:
resources:
static-locations:
- classpath:/static/
- classpath:/public/
- file:/data/uploads/注意:如果你加了 file: 路径,该目录必须真实存在,且应用有读取权限;Windows 下路径要用正斜杠或双反斜杠,如 file:C:/uploads/。
用 @Configuration 类灵活映射
当需要更精细控制——比如把不同 URL 前缀指向完全不同的物理位置,或者想兼容旧版路径、做上传目录映射——就用 Java 配置类。它不覆盖默认规则,而是叠加额外映射:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 实现
WebMvcConfigurer接口,重写addResourceHandlers方法; -
addResourceHandler设置访问路径模式(如/uploads/**); -
addResourceLocations设置对应的真实路径,file:开头表示本地磁盘,classpath:表示 jar 内资源; - 末尾必须带斜杠,比如
"file:/data/uploads/",否则会报错或找不到文件。
示例:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 用户上传图片走这个路径
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:/data/uploads/");
// 自定义前端资源走另一个路径
registry.addResourceHandler("/assets/**")
.addResourceLocations("classpath:/static/assets/");
}
}默认静态资源目录与优先级
即使不配任何东西,Spring Boot 也会自动扫描以下 5 个 classpath 下的目录(按顺序匹配,前面的优先):
META-INF/resources/resources/-
static/(最常用) public/-
webapp/(传统 WAR 项目用,JAR 启动一般忽略)
比如你在 src/main/resources/static/ 放了 style.css,又在 src/main/resources/public/ 放了同名文件,访问 /style.css 拿到的是 static 下的版本。
常见问题提醒
- 配置了
static-locations后,**默认的 5 个路径就不再自动包含**,必须手动列全,否则/static/等目录失效; - 使用
file:映射时,路径必须以/结尾,且启动用户要有读权限; - 如果用了 Spring Security,记得放行静态资源路径,比如
permitAll().antMatchers("/res/**", "/uploads/**"); - 打包成 JAR 后,
file:路径依然有效,但classpath:只能访问 JAR 包内的资源。










