Spring Boot 如何处理静态资源映射?
Spring Boot 采用“约定优于配置”的理念,为静态资源(如 HTML、CSS、JavaScript、图片等)提供了非常方便的默认映射机制,同时也支持灵活的自定义配置。
以下是 Spring Boot 处理静态资源映射的详细解析:
1. 默认规则 (Out of the Box)
Spring Boot 的自动配置类 WebMvcAutoConfiguration 默认会将以下 类路径 (Classpath) 下的目录映射为静态资源目录:
/META-INF/resources//resources//static//public/
映射路径:
默认情况下,映射路径是 /。这意味着你可以直接通过根路径访问这些目录下的文件。
举例:
如果你有一个文件 src/main/resources/static/js/app.js。
- 启动应用后,访问地址为:
http://localhost:8080/js/app.js - 注意: 请求地址中不需要包含
static这个目录名。
2. WebJars 映射
Spring Boot 自动支持 WebJars 。WebJars 是将前端库(如 jQuery, Bootstrap)打包成 JAR 文件,通过 Maven/Gradle 依赖管理。
- 映射规则: 所有
/webjars/的请求都会被映射到 classpath 下的/META-INF/resources/webjars/目录。
举例:
如果你引入了 jQuery 的依赖:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
你可以通过 http://localhost:8080/webjars/jquery/3.6.0/jquery.min.js 访问。
3. 修改默认配置 (通过配置文件)
你可以通过 application.properties 或 application.yml 修改默认行为。
A. 修改静态资源访问前缀 (URL路径)
默认是根路径 /,如果你想给所有静态资源加一个前缀(例如 /res/):
# application.properties
spring.mvc.static-path-pattern=/res/
此时,访问 app.js 的地址变为:http://localhost:8080/res/js/app.js
B. 修改静态资源物理存储位置
如果你不想用默认的 /static 等目录,或者想添加文件系统中的目录(非 classpath):
# application.properties
# 注意:这会覆盖默认的4个目录,除非你把默认的也写进去
spring.web.resources.static-locations=classpath:/my-static/,file:/opt/data/
classpath:/my-static/:指向类路径下的目录。file:/opt/data/:指向服务器本地磁盘的目录(常用于上传文件的回显)。
4. 自定义映射 (通过 Java 代码)
如果你需要更复杂的逻辑,或者不想使用配置文件,可以实现 WebMvcConfigurer 接口。
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 语法:registry.addResourceHandler("请求路径").addResourceLocations("物理路径");
// 示例:将 /images/ 映射到本地磁盘 D:/myserver/uploads/
registry.addResourceHandler("/images/")
.addResourceLocations("file:D:/myserver/uploads/");
// 示例:保留默认配置的同时,增加自定义目录
// 注意:如果你不手动添加默认的classpath路径,这里可能会导致默认路径失效,
// 但通常 addResourceHandler 是追加模式,不会覆盖 Spring Boot 的默认配置,
// 除非你接管了整个 WebMvcConfigurationSupport。
}
}
5. 欢迎页 (Welcome Page) 与 Favicon
Spring Boot 会自动处理以下特殊文件:
欢迎页 (
index.html):
如果在上述任何一个静态资源目录下存在index.html,当你访问根路径http://localhost:8080/时,Spring Boot 会自动展示该页面。图标 (
favicon.ico):
如果在静态资源目录下存在favicon.ico,它会被自动用作浏览器的标签页图标。
6. 静态资源缓存与版本控制 (进阶)
在生产环境中,为了解决浏览器缓存导致前端代码不更新的问题,Spring Boot 提供了资源链(Resource Chain)配置。
# 开启资源链
spring.web.resources.chain.enabled=true
# 开启内容摘要策略 (Content Versioning)
spring.web.resources.chain.strategy.content.enabled=true
# 配置路径
spring.web.resources.chain.strategy.content.paths=/**
开启后,Spring Boot 会根据文件内容计算 Hash 值,访问路径可能变成 /js/app-69ea...js,配合前端模板引擎(如 Thymeleaf)使用时,可以自动生成带 Hash 的链接。
总结
- 最简单用法: 把文件扔到
src/main/resources/static/下,直接访问。 - 改 URL 前缀: 配置
spring.mvc.static-path-pattern。 - 映射本地文件: 实现
WebMvcConfigurer的addResourceHandlers方法。