SpringBoot--静态资源映射处理

在 web 开发中,静态资源的访问是必不可少的,如图片、js、css等资源的访问

SpringBoot 对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求

(嵌入式 servlet 容器)先决知识

  1. request.getSession().getServletContext().getRealPath("/") ,这个很重要,将其称为 docBase ,即 “文档基目录”
  2. 在单模块项目中,如果不存在 src/main/webapp 目录,则 docBase 被设置为C盘下临时的随机目录,例如 C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.2872246570823772896.8080\
  3. 在多模块项目中,要留意 jvm 启动路径。无论该启动路径是位于父模块的路径下还是子模块的,如果 jvm 启动路径下不存在 src/main/webapp 目录,则 docBase 被设置为C盘下临时的随机目录

综上,如果想要依照传统方式通过“文档基目录”去定位文档资源( html 、 css 、 js ),则要确保存在 src/main/webapp 目录,即 docBase 不会被设置为随机目录;否则,建议直接设置 SpringBoot 将其定位至 classpath 下的资源(即 src/main/resource 目录下的资源):

SpringBoot 项目中 classpath 指向:

1、用 maven 构建( build )项目时,默认的 classpath 指向 target/classes/

2、用 maven 打包( package )项目时,默认的 classpath 指向 war 内部的 WEB-INF/classes/

获取 SpringBoot 项目默认的 classpath :

String classpath = ResourceUtils.getURL("classpath:").getPath();

具体配置如下:

一、默认静态资源映射(不存在 @EnableWebMVC )

SpringBoot 对静态资源映射提供了默认配置

  1. SpringBoot 的 @EnableAutoConfiguration 会启用自动配置类 WebMvcAutoConfiguration ,该类配置了一些默认的静态资源映射
  • SpringBoot 默认将 localhost:8080/** 所有访问依次映射到以下目录:
目录 优先级
classpath:/META-INF/resources/ 最高
classpath:/resources/ 其次
classpath:/static/ 第三
classpath:/public/ 最低
  • 自动映射 localhost:8080/webjars/** 为以下路径

    classpath:/META-INF/resources/webjars/

  1. 此时,我们不需要多做什么,只要将静态资源放入 src/main/resources 目录下的 resources 、 static 或 public 文件夹下,即可通过 url 定位相关资源,例如 localhost:8080/index.html 可定位至 src/main/resources/static/index.html (即编译打包后的 target/classes/static/index.html)

如:在 resources 目录下新建 public 、 resources 、 static 三个目录,并分别放入 a.jpg 、 b.jpg 、 c.jpg 图片

浏览器分别访问:

http://localhost:8080/a.jpg
http://localhost:8080/b.jpg
http://localhost:8080/c.jpg

均能正常访问相应的图片资源。那么说明, SpringBoot 默认会挨个从 resources 、 static 、 public 里面找是否存在相应的资源,如果有则直接返回

二、自定义静态资源映射(存在 @EnableWebMVC)

在实际开发中,可能需要自定义静态资源访问路径,那么可以继承 WebMvcConfigurerAdapter 来实现

即如果使用了 @EnableWebMvc ,则自动配置类 WebMvcAutoConfiguration 会失效,因此默认映射路径 /static , /public , META-INF/resources , /resources 都将失效

  • 第一种方式:自定义静态资源配置类

    • 无任何前缀 -> “文档根目录”(一般指代 src/main/webapp 目录), 例如 localhost:8080/index.html 定位至 src/main/webapp/static/index.html

    • 存在前缀 classpath -> 类路径(一般指代 src/main/resources 目录)

    • 存在前缀 file:// -> 文件系统路径(“绝对路径”)

    @Configuration
    public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    
       //配置静态资源处理
       @Override
       public void addResourceHandlers(ResourceHandlerRegistry registry) {
           // 将所有的访问路径都映射到真实路径目录下
           // addResourceHandler()添加的是访问路径
           registry.addResourceHandler("/**")
           // addResourceLocations()添加的是映射后的真实路径,映射的真实路径末尾必须加"/" ,否则映射不到
                   .addResourceLocations("resources/", "static/", "public/", 
                   "META-INF/resources/")
                   .addResourceLocations("classpath:resources/", "classpath:static/", 
                   "classpath:public/", "classpath:META-INF/resources/")
                   .addResourceLocations("file:///tmp/webapps/");
       }
    }
    

重启项目,访问: http://localhost:8080/static/c.jpg 能正常访问 static 目录下的 c.jpg 图片资源

  • 第二种方式:在 application.properties 配置

在 application.properties 中添加配置:

spring.mvc.static-path-pattern=/static/**

重启项目,访问: http://localhost:8080/static/c.jpg 同样能正常访问 static 目录下的 c.jpg 图片资源

注意:通过 spring.mvc.static-path-pattern 这种方式配置,会使 SpringBoot 的默认配置失效,也就是说, /public/resources 等默认配置不能使用

配置中配置了静态模式为 /static/ ,就只能通过 /static/ 来访问

参考博客:https://www.cnblogs.com/magicalSam/p/7189476.html

posted @   Li-Xiaolei  阅读(1984)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示