基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

Spring Boot 如何处理静态资源映射?

知识点图片

Spring Boot 采用“约定优于配置”的理念,为静态资源(如 HTML、CSS、JavaScript、图片等)提供了非常方便的默认映射机制,同时也支持灵活的自定义配置。

以下是 Spring Boot 处理静态资源映射的详细解析:

1. 默认规则 (Out of the Box)

Spring Boot 的自动配置类 WebMvcAutoConfiguration 默认会将以下 类路径 (Classpath) 下的目录映射为静态资源目录:

  1. /META-INF/resources/
  2. /resources/
  3. /static/
  4. /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 的依赖:

xml
<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.propertiesapplication.yml 修改默认行为。

A. 修改静态资源访问前缀 (URL路径)

默认是根路径 /,如果你想给所有静态资源加一个前缀(例如 /res/):

plaintext
# application.properties
spring.mvc.static-path-pattern=/res/

此时,访问 app.js 的地址变为:http://localhost:8080/res/js/app.js

B. 修改静态资源物理存储位置

如果你不想用默认的 /static 等目录,或者想添加文件系统中的目录(非 classpath):

plaintext
# application.properties
# 注意:这会覆盖默认的4个目录,除非你把默认的也写进去
spring.web.resources.static-locations=classpath:/my-static/,file:/opt/data/
  • classpath:/my-static/:指向类路径下的目录。
  • file:/opt/data/:指向服务器本地磁盘的目录(常用于上传文件的回显)。

4. 自定义映射 (通过 Java 代码)

如果你需要更复杂的逻辑,或者不想使用配置文件,可以实现 WebMvcConfigurer 接口。

java
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)配置。

plaintext
# 开启资源链
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 的链接。

总结

  1. 最简单用法: 把文件扔到 src/main/resources/static/ 下,直接访问。
  2. 改 URL 前缀: 配置 spring.mvc.static-path-pattern
  3. 映射本地文件: 实现 WebMvcConfigureraddResourceHandlers 方法。
00:00
00:00