【SpringBoot】配置靜態資源

SpringBoot中有兩項靜態資源配置項:
1、spring.mvc.static-path-pattern
2、spring.resources.static-locations
配置出差錯時,導致404錯誤,找不到靜態資源;

1、 spring.mvc.static-path-pattern

它代表的是應該以什麼樣的路徑來訪問靜態資源,也就是隻有靜態資源滿足什麼樣的匹配條件,Spring Boot纔會處理靜態資源請求。官方的配置爲:

# 這裏表示只有靜態資源的訪問路徑爲/resources/**時,纔會處理請求
spring.mvc.static-path-pattern = /resources/**

假定採用默認的配置端口,那麼只有請求地址類似於“http://localhost:8080/resources/jquery.js”時,Spring Boot纔會處理此請求,處理方式是將根據模式匹配後的文件名查找本地文件,那麼應該在什麼地方查找本地文件呢?這就是“spring.resources.static-locations”的作用了。

2、 spring.resources.static-locations

這是一個列表性的配置,用於說明靜態資源文件的查找路徑,查找文件是會依賴於配置的先後順序依次進行,默認的官方配置如下:

spring.resources.static-locations = classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

繼續以上面的請求地址爲例,“http://localhost:8080/resources/jquery.js”就會在上述的四個路徑中依次查找是否存在“jquery.js”文件,如果找到了,則返回此文件,否則返回404錯誤。

2.1、配置file路徑

需要指定的是一個具體的硬盤路徑時,需要使用file,其他的使用classpath指的是系統環境變量;

file.uploadFolder = /home/uploadFiles/
spring.resources.static-locations = classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${file.uploadFolder}

3、靜態資源的Bean配置

“spring.mvc.static-path-pattern”與“spring.resources.static-locations”組合起來演繹了nginx的映射配置,如果熟悉Spring MVC,那麼理解起來更加簡單,它們的作用可以用Bean配置表示,如下:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("/public-resources/")
                .setCacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic());
    }
}

或者等同與以下的XML;

<mvc:resources mapping="/resources/**" location="/public-resources/">
    <mvc:cache-control max-age="3600" cache-public="true"/>
</mvc:resources>

4、總結

“spring.mvc.static-path-pattern”用於闡述HTTP請求地址,而“spring.resources.static-locations”則用於描述靜態資源的存放位置。

 

注:

這裏特別說明下上述配置中提到的classpath。SpringBoot項目創建完成後,會生成該項目名稱+iml後綴的文件。該文件位於項目的根目錄下。打開後,在name="NewModuleRootManager"的component聲明中,會有幾個默認content聲明。其中sourceFolder 中聲明的就是classpath,只是類型不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章