spring boot默认将/static/等目录资源映射到根路径,可通过static-path-pattern自定义访问前缀,resources.cache设置缓存时间,并支持gzip压缩与内容哈希版本策略。

Spring Boot 对静态资源的处理默认就很省心,但实际项目中常需要调整映射路径或控制缓存行为。关键就两点:让资源能被正确访问,以及让浏览器合理缓存——既提升加载速度,又避免用户看到旧版本。
默认静态资源目录与映射规则
Spring Boot 启动时自动扫描以下四个 classpath 下的目录(按优先级从高到低):
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/(最常用,推荐主用)
- classpath:/public/
这些目录下的文件,默认映射到应用根路径 /。比如 src/main/resources/static/js/app.js,访问地址就是 http://localhost:8080/js/app.js。不需要写 Controller,也不用额外配置。
注意:如果多个目录里存在同名文件(如两个 logo.png),Spring Boot 只会返回优先级最高的那个,后面的会被忽略——所以别在不同目录放重复资源,容易踩坑。
自定义静态资源请求路径
如果你希望所有静态资源统一走 /assets/** 或 /static/** 这样的前缀,而不是直接暴露在根路径下,可通过配置修改:
- 在
application.yml中设置:
spring:
mvc:
static-path-pattern: /assets/** # 浏览器访问路径前缀
resources:
static-locations: classpath:/static/, classpath:/public/ # 实际资源所在位置配置后,static/css/style.css 就必须通过 http://localhost:8080/assets/css/style.css 访问。
⚠️ 注意:static-locations 是“真实存放位置”,static-path-pattern 是“对外暴露路径”,二者独立配置、互不影响。你可以把资源放在 /custom/ 目录,同时映射成 /res/**。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
配置浏览器缓存时间
默认情况下,Spring Boot 对静态资源不设缓存(Cache-Control: no-cache),每次都会向服务器验证。生产环境务必开启缓存:
- yml 方式(推荐):
spring:
resources:
cache:
period: 31536000 # 单位:秒,即 365 天
cachecontrol:
max-age: 31536000
no-cache: false
must-revalidate: false这样响应头会带上 Cache-Control: max-age=31536000,浏览器将长期缓存该资源。
更精细的控制还可启用 Gzip 压缩和内容哈希版本策略(防缓存失效):
- 开启 Gzip:
spring.resources.chain.gzipped=true - 启用内容哈希版本(如
app.a1b2c3.js):spring.resources.chain.strategy.content.enabled=true
启用后,即使你更新了 JS 文件,URL 也会自动变化,浏览器强制加载新版本,彻底规避缓存问题。
编程方式配置(适合复杂场景)
当 yml 配置不够用(比如要为不同资源类型设不同缓存策略,或集成 CDN 路径),可使用 Java Config:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/public/**")
.addResourceLocations("classpath:/public/")
.setCachePeriod(86400) // 1天
.resourceChain(true)
.addResolver(new VersionResourceResolver()
.addVersionStrategy(new ContentVersionStrategy(), "/**"));
}
}这段代码明确将 /public/** 映射到 classpath 下的 /public/,并启用内容哈希版本和 1 天缓存。适合对部分资源精细化管理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










