歡迎您光臨本站 註冊首頁

Springboot靜態資源訪問實現代碼解析

←手機掃碼閱讀     ml5rwbikls @ 2020-06-08 , reply:0

springboot靜態資源加載默認是從/static(或/public或/resources或/META-INF/resources) 目錄下加載靜態資源。

加載的優選級別:/META-INF/resources》/resources》/public》/static

靜態資源的加載源碼分析(WebMvcAutoConfiguration類)

首先從WebMvcAutoConfiguration.class自動配置類部分代碼來看:

  //添加靜態資源規則  public void addResourceHandlers(ResourceHandlerRegistry registry) {        if (!this.resourceProperties.isAddMappings()) {          logger.debug("Default resource handling disabled");        } else {          Duration cachePeriod = this.resourceProperties.getCache().getPeriod();          CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();          //webjars依賴映射規則          if (!registry.hasMappingForPattern("/webjars/**")) {            this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));          }  				//本地配置的映射規則          //this.resourceProperties.getStaticLocations() 從ResourceProperties中加載靜態路徑          String staticPathPattern = this.mvcProperties.getStaticPathPattern();          if (!registry.hasMappingForPattern(staticPathPattern)) {            this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations            this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));          }          }      }

 

ResourceProperties類部分源碼

  @ConfigurationProperties(    prefix = "spring.resources",    ignoreUnknownFields = false  )  public class ResourceProperties {    //springboot默認的加載路徑    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};    private String[] staticLocations;    private boolean addMappings;    private final ResourceProperties.Chain chain;    private final ResourceProperties.Cache cache;

 

映射規則總結

在springboot靜態資源加載規則中,除了”標準“靜態資源位置之外,還有一個較為特殊的WebJars

“標準”靜態資源映射規則

所有的“/**”的請求,如果沒有對應的處理,那麼就去默認映射的靜態資源目錄下去找,如下所示:

  1. "classpath:/META-INF/resources/"

  2. "classpath:/resources/"

  3. "classpath:/static/",

  4. "classpath:/public/"

  5. “/**”

所有的webjars的請求都會去 ”classpath:/META-INF/resources/webjars/**“去資源

(如果 以jar包的方式來引入jquery包)

在pom.xml中引入依賴

   org.webjarsjquery3.3.1-2

 

從引入的包目錄來看

springboot默認歡迎頁面

自動去加載默認目錄下的index.html;如static/index.html

自定義配置靜態資源目錄

在application.properties文件中去配置

//配置test為靜態資源目錄
 spring.resources.static-locations=classpath:/test/

遇到的坑

在配置了靜態資源目錄的時候,跳轉到的頁面路徑不能寫絕對路徑,

比如:spring.resources.static-locations=classpath:/test/ 我配置test為靜態資源的加載位置,在訪問的時候不需要寫test

請求:http://127.0.0.1:8085/test/1.png

請求:http://127.0.0.1:8085/1.png

                                              

   


[ml5rwbikls ] Springboot靜態資源訪問實現代碼解析已經有223次圍觀

http://coctec.com/docs/java/show-post-237451.html