在基于Springboot
的Spring MVC
应用中,静态资源访问配置有以下几种方案 :
- 使用缺省位置存取静态资源:
classpath
静态资源路径 - 配置特定路径的资源存取位置:
classpath
静态资源路径或者文件系统静态资源文件路径
本文基于Springboot
+ Tomcat
+ Spring MVC
应用来看看以上几种方案如何实施 :
1. 使用缺省位置存取静态资源
缺省情况下,Springboot
自动配置为Spring MVC
应用指定了缺省的静态资源存放位置如下 :
-
映射到
/**
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
-
映射到
/webjars/**
classpath:/META-INF/resources/webjars/
不过需要注意的是这些路径都是classpath
路径,也就是说所要访问的静态资源是需要打包到发布包(jar
或者war
)中的。这种方式对于存在于文件系统中的其他资源文件是不可行的,因为这些文件有可能在应用启动时尚未出现(比如上传的资源文件)。
2. 配置特定路径的资源存取位置
2.1 通过配置参数
除了使用缺省静态资源路径机制,我们可以通过配置指定特定路径的资源存取位置。这就是通过如下两个参数 :
# 指定静态资源路径数组,可以是classpath路径,也可以是文件系统路径
# 不存在表示使用缺省机制,存在则使用并覆盖缺省机制
spring.resources.static-locations
# 指定 spring.resources.static-locations 设置的静态资源路径内的资源映射到哪个URL路径
# 不存在表示使用缺省机制,存在则使用并覆盖缺省机制
spring.mvc.static-path-pattern
对于系统缺省配置,相当于如下参数配置 :
spring :
resources :
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
mvc :
static-path-pattern : /**
通过使用参数spring.resources.static-locations
和spring.mvc.static-path-pattern
,可以指定跟缺省机制不同的静态资源文件位置和不同的映射路径,甚至可以是文件系统内的静态资源文件路径 。 我们来看如下例子 :
spring :
resources :
static-locations: classpath:/MyStatic/,file:/web_starter_repo/
mvc :
static-path-pattern : /my/**
通过该配置,我们将发布包路径/MyStatic/
和文件系统路径/web_starter_repo/
都映射到了URL
路径/my/**
。加入系统运行在http://localhost:8080/
,并且在发布包内/MyStatic/
路径下存在图片p1.png
,在文件系统路径/web_starter_repo/
存在图片p2.png
,则通过如下方式可以访问到这两个图片 :
http://localhost:8080/my/p1.png
http://localhost:8080/my/p2.png
2.2 通过程序化配置
2.1
小节介绍的方式是通过配置参数设置静态资源路径和映射路径,实际上同样的效果可以通过程序化配置来实现。对于喜欢通过程序化配置方式的开发人员,可以考虑使用此方式 。对于2.1
小节同样的例子,其程序化配置方式如下所示 :
// 注意:
// 1. 在 SpringBoot Web MVC 应用中,一旦使用了 @EnableWebMvc,
// 则 WebMvcAutoConfiguration 自动配置提供的默认机制会失效,
// 会转而使用此处 @EnableWebMvc + WebMvcConfigurer 的 Spring MVC 配置。
// 2. 如果你只是想在缺省 WebMvcAutoConfiguration 机制之上做部分增量性定制,
// 这里使用 WebMvcConfigurer 但不要使用 @EnableWebMvc 。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 静态资源文件映射配置
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 注意 :
// 1. addResourceHandler 参数可以有多个
// 2. addResourceLocations 参数可以是多个,可以混合使用 file: 和 classpath : 资源路径
// 3. addResourceLocations 参数中资源路径必须使用 / 结尾,如果没有此结尾则访问不到
// 映射到多个静态资源路径到某个URL pattern
registry.addResourceHandler("/my/**").addResourceLocations(
"classpath:/MyStatic/","file:/web_starter_repo/");
}
}