一、默認靜態資源映射規則
1. 有5個默認的靜態資源存放位置
在 Spring Boot 中,默認情況下,一共有5個位置可以放靜態資源,Spring Boot 默認將 /** 所有訪問映射到以下目錄,五個路徑分別是如下5個:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
"/" : 靜態資源存放在當前項目的根路徑下,放在這個根路徑下也是可以訪問的
例如:
(1)、在src/main/resources/目錄下創建 META-INF/resources文件夾,存放a.jpg 圖片文件
(2)、在src/main/resources/目錄下創建resources文件夾 ,存放圖片b.jpg 圖片文件(3)、在src/main/resources/目錄下創建static文件夾 ,存放圖片c.jpg 圖片文件
(4)、在src/main/resources/目錄下創建 public文件夾 ,存放圖片d.jpg 圖片文件
(5)、在src/main/resources/根目錄直接存放靜態資源文件,存放圖片e.jpg 圖片文件
總結: 上面這幾個都是靜態資源的映射路徑,優先級順序爲:META-INF/resources > resources > static > public > /
2.配置application.yml的端口
# 開發環境配置
server:
# 服務器的HTTP端口,默認爲8080
port: 8787
3.瀏覽器分別訪問以下靜態資源:
http://localhost:8787/a.jpg
http://localhost:8787/b.jpg
http://localhost:8787/c.jpg
http://localhost:8787/d.jpg
http://localhost:8787/e.jpg
均能正常訪問相應的圖片資源。那麼說明,Spring Boot 默認會挨個從 public、 resources 、static目錄裏面找是否存在相應的資源,如果有則直接返回; 沒有則會跳轉到SpringBoot默認的404頁面。
講到這裏,我們已經知道了上面5種都是SpringBoot框架官方約定成俗的靜態資源默認存放的位置,以及默認的訪問映射到靜態資源文件的URL。 那麼接下來我們瞭解下在SpringBoot中如何自定義靜態資源映射。
二、自定義靜態資源映射配置,訪問靜態資源文件
在實際開發中,可能需要自定義靜態資源訪問路徑,我們有好幾種做法可以實現,首先可以繼承WebMvcConfigurerAdapter類來實現(注意: 在SpringBoot2.0及Spring 5.0 之後版本WebMvcConfigurerAdapter已被廢棄)。
首先我貼一張項目靜態資源存放文件的圖:
1. a.jpg圖片存放在static默認的目錄下面,訪問:http://127.0.0.1:8787/a.jpg ,可以正確的訪問到
2. b.jpg圖片存放在static目錄下的img目錄裏面,img目錄就是根據需求我們自定義的一個存放靜態文件的文件夾,訪問: http://127.0.0.1:8787/img/b.jpg , 可以正常的訪問到
通過上述測試,我們可以將靜態資源訪問分爲以下兩類:
1. 訪問默認靜態資源目錄文件:
如果是訪問默認靜態資源目錄下的文件,直接使用:https:127.0.0.1/8787/a.jpg即可;
2. 訪問自定義文件夾存放靜態資源的文件:
如果是訪問以自定義文件夾形式存放靜態資源的文件,則需要帶上自定義的文件夾名稱,這樣一來雖然不用做任何配置,但是需要根據文件夾的名稱來確定訪問資源文件的URL,這樣及其不方便,爲了統一訪問靜態資源路徑,有如下3種配置方式。
3. 在項目的static-img文件夾下放一個圖片,我們就叫c.jpg
方式1:繼承WebMvcConfigurerAdapter類實現靜態資源配置
package com.thinkingcao.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 配置靜態資源映射
* @author cao
* @since 2019/01/23
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//將所有/static/** 訪問都映射到classpath:/static/ 目錄下
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/img/");
}
}
重啓項目,訪問靜態資源:http://localhost:8787/static/c.jpg , 能正常訪問static目錄下的c.jpg圖片資源。
方式2:在application.yml配置文件中配置(推薦)
在application.yml中添加配置,將所有靜態資源文件訪問都映射到classpath:/static/img 目錄下:
spring:
mvc:
#資源文件的訪問路徑,例如:http://127.0.0.1:8787/static/20190123115705.jpg
static-path-pattern: /static/**
resources:
#資源文件存放的位置
static-locations: classpath:/static/img/
重啓項目,訪問靜態資源:http://localhost:8787/static/c.jpg , 同樣能正常訪問static目錄下的c.jpg圖片資源。
注意:通過spring.mvc.static-path-pattern這種方式配置,會使Spring Boot的默認配置失效,也就是說/public 、/resources 等默認配置不能使用了。
總結: 上述配置中配置了靜態模式爲/static/,就只能通過/static/來訪問。
方式3:自定義配置類實現WebMvcConfigurer接口(推薦)
@Configuration
public class AdminWebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 設置項目靜態資源訪問
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/img/");
}
}
小結: 上面實現自定義靜態資源映射的實現一共有3種方式,其目的都是相同的,那就是不管靜態資源目錄結構如何,我的訪問前綴都是統一的,都是通過: http://localhost:8787/static/xx.jpg 的形式訪問,上述3中方式我推薦方式二和方式三。
三、自定義外部靜態資源映射,訪問本地磁盤圖片文件
想要實現自定義靜態資源映射地址,訪問某個磁盤上的圖片文件,這裏講解4種實現方式
方式1: application.yml文件中配置 (推薦)
spring:
mvc:
#訪問路徑,例如: 127.0.0.1:8787/images/aa.jpg
static-path-pattern: /images/**
resources:
#資源存放的磁盤位置
static-locations: file:D://Images//壁紙/
本地磁盤圖片:
訪問靜態資源:http://127.0.0.1:8787/images/護眼模式_20190123110237.jpg
注意:
1. 如果yml中配置了項目訪問前綴context-path, 請注意,訪問路徑需要加上前綴,別漏掉了,注意細節問題。
訪問效果如下:
方式2: 繼承WebMvcConfigurerAdapter 類
在代碼上配置, 繼承WebMvcConfigurerAdapter類,但是在SpringBoot2.0和Spring 5.0 WebMvcConfigurerAdapter及之後的版本中已被廢棄,目前找到解決方案就有兩種,請往下看:
- 重寫WebMvcConfigurerAdapter類
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* <pre>
* @Description:配置靜態資源映射
* @Aouth: cao_wencao
* @Date: 2019-01-23 16:11
* </pre>
*/
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler是指你想在url請求的路徑
//addResourceLocations是圖片存放的真實路徑
registry.addResourceHandler("/images/**").addResourceLocations("file:D://Images//壁紙/");
super.addResourceHandlers(registry);
}
}
- 說到這裏,我列舉一下WebMvcConfigurerAdapter 比較常用的需要重寫的接口,後續用得着
/** 解決跨域問題 **/
public void addCorsMappings(CorsRegistry registry) ;
/** 添加攔截器 **/
void addInterceptors(InterceptorRegistry registry);
/** 這裏配置視圖解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 配置內容裁決的一些選項 **/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 視圖跳轉控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 靜態資源處理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默認靜態資源處理器 **/
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
方式3:實現WebMvcConfigurer接口(推薦)
實現WebMvcConfigurer接口這種方式是新版本中替代WebMvcConfigurerAdapter 已過時的一種解決方案。
- 直接實現WebMvcConfigurer接口(官方推薦使用這個)
package com.thinkingcao.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* <pre>
* @Description:
* @Aouth: cao_wencao
* @Date: 2019-01-23 17:28
* </pre>
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("file:D://Images//壁紙/");
}
}
訪問靜態資源文件: http://127.0.0.1:8787/images/護眼模式_20191229130634.jpg
效果圖如下:
方式4 :繼承WebMvcConfigurationSupport類
繼承WebMvcConfigurationSupport類這種方式是新版本中替代WebMvcConfigurerAdapter 已過時的第二種解決方案。
- 繼承WebMvcConfigurationSupport類
package com.thinkingcao.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* <pre>
* @Description:
* @Aouth: cao_wencao
* @Date: 2019-01-23 17:39
* </pre>
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**").addResourceLocations("file:D://Images//壁紙/");
}
}
訪問靜態資源文件:http://127.0.0.1:8787/images/護眼模式_20191229130648.jpg
效果圖如下:
- 貼一下WebConfig繼承WebMvcConfigurationSupport類的常用配置
package com.thinkingcao.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* <pre>
* @Description:
* @Aouth: cao_wencao
* @Date: 2019-01-23 17:39
* </pre>
*/
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
/**
* 跨域支持
*
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600 * 24);
}
/**
* 添加靜態資源--過濾swagger-api (開源的在線API文檔)
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/images/**")
.addResourceLocations("file:D:/Images/壁紙/");
//過濾swagger
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/swagger-resources/**")
.addResourceLocations("classpath:/META-INF/resources/swagger-resources/");
registry.addResourceHandler("/swagger/**")
.addResourceLocations("classpath:/META-INF/resources/swagger*");
registry.addResourceHandler("/v2/api-docs/**")
.addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
}
}
四、源碼
源碼: https://github.com/Thinkingcao/SpringBootLearning/tree/master/springboot-aop