九、Spring Boot 静态资源访问配置
使用场景:有一些文件需要让用户直接访问的静态资源,例如导入excel的模板或者小的图标
当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,springboot是帮我们处理了,默认配置了五个地址,将文件放在这个五个地址下,可以直接访问,那么优先级按照列出的顺序:
五个路径分别是如下5个:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- /
前四个目录好理解,分别对应了resources目录下不同的目录,系统默认创建了 classpath:/static/
第五个"/":使用JSP的时候有一个webapp目录,使用springboot默认是没有,但是可以手动新建一个,这第五个目录指的就是webapp目录下
使用
常用的地址是classpath:/static/
,将文件放在改目录下时,访问的地址为 http://localhost:8080/1.png
,地址中并不包含static
因为springboot的配置(在springMVC中也有这样的配置 <mvc:resources mapping="/**" location="/static/"/>
):
查看源码,WebMvcAutoConfiguration 类中看到了 SpringMVC 自动化配置的相关的内容,找到了静态资源拦截的配置,如下:
this.mvcProperties.getStaticPathPattern() 方法对应的值是 “/**”,this.resourceProperties.getStaticLocations()方法返回了四个位置,分别是:”classpath:/META-INF/resources/”, “classpath:/resources/”,”classpath:/static/”, “classpath:/public/”,然后在getResourceLocations方法中,又添加了“/”,因此这里返回值一共有5个。其中,/表示webapp目录,即webapp中的静态文件也可以直接访问。静态资源的匹配路径按照定义路径优先级依次降低。因此这里的配置和我们前面提到的如出一辙。这样大伙就知道了为什么Spring Boot 中支持5个静态资源位置,同时也明白了为什么静态资源请求路径中不需要/static,因为在路径映射中已经自动的添加上了/static了。
自定义配置
方式一:application.properties
# 定义资源位置,该配置表示可以将静态资源放在 resources目录下的任意地方
spring.resources.static-locations=classpath:/
# 定义请求 URL 规则
spring.mvc.static-path-pattern=/**
Java 代码定义
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/");
}
}