SpringBoot訪問靜態(tài)資源的配置及順序說明
訪問靜態(tài)資源的配置及順序
今天在玩SpringBoot的demo的時(shí)候,放了張圖片在resources目錄下,啟動(dòng)區(qū)訪問的時(shí)候,突然好奇是識(shí)別哪些文件夾來展示靜態(tài)資源的, 為什么有時(shí)候放的文件夾不能顯示,有的卻可以.
1. SpringBoot的默認(rèn)配置
首先我們打開WebMvcAutoConfiguration類, 因?yàn)槭庆o態(tài)資源的位置, 所以搜索location,找到這一行代碼:
?String staticPathPattern = this.mvcProperties.getStaticPathPattern(); ? ? if (!registry.hasMappingForPattern(staticPathPattern)) { ? ? ? this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl)); ? ? }
然后進(jìn)入getStaticLocations這個(gè)方法,到了ResourceProperties類中的
? public String[] getStaticLocations() { ? ? return this.staticLocations; ? }
這個(gè)方法,那接著看staticLocations這個(gè)屬性,其實(shí)就到了這個(gè)類的頂部
public class ResourceProperties { ? 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; ? public ResourceProperties() { ? ? this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS; ? ? this.addMappings = true; ? ? this.chain = new ResourceProperties.Chain(); ? ? this.cache = new ResourceProperties.Cache(); ? } ... }
可以看出,靜態(tài)資源默認(rèn)的位置是classpath,也就是resource目錄下的:
- /META-INF/resources
- /resources
- /static
- /public
而且順序就是數(shù)組的順序.
2. 測(cè)試
我們創(chuàng)建一個(gè)index.html頁(yè)面,然后<h1>標(biāo)簽分別是各自的路徑,比如在/META-INF/resources下的index.html:
<!DOCTYPE html > <html> <head lang="en"> ? ? <meta charset="UTF-8" /> ? ? <title>http-template</title> </head> <body> <h1 >META-INF.resources</h1> </body> </html>
在上面四個(gè)文件夾中各自放一個(gè)不同標(biāo)題的頁(yè)面,啟動(dòng)springboot,訪問localhost:8080
可以看到頁(yè)面的標(biāo)題是/META-INF/resources, 說明是按照上面的默認(rèn)配置讀取順序讀取的
注意,這里不需要加這個(gè)靜態(tài)資源文件夾的名字!!,比如localhost:8080能看到頁(yè)面,但是localhost:8080/static或localhost:8080/META-INF/resources是訪問不了的
為了繼續(xù)證實(shí)四個(gè)文件夾都可以,我放了同一個(gè)圖片在各自文件夾,只是名字不同,結(jié)構(gòu)如下:
訪問
- localhost:8080/2b.jpg
- localhost:8080/3b.jpg
- localhost:8080/4b.jpg
- localhost:8080/5b.jpg
都能訪問(不需要加靜態(tài)資源文件夾的名字!!!), 反而是resource根目錄,也就是classpath下的1b.jpg不能訪問
3.配置
配置一: 是否可以訪問靜態(tài)資源
spring: mvc: static-path-pattern: /static/**
這個(gè)配置默認(rèn)是/**, 表示的是正則匹配到這種路徑才去訪問靜態(tài)資源,所以默認(rèn)情況下,上面四個(gè)能夠訪問的路徑也必須加上/zgd才可以訪問
另一個(gè)需要注意的事,默認(rèn)情況下訪問index.html頁(yè)面,不需要加這個(gè)文件名,比如localhost:8080,但是配置了該項(xiàng)后,需要文件名.localhost:8080/zgd/index.html
加上index.html資源全稱后可以訪問
配置二: 去哪找靜態(tài)資源
這個(gè)配置就是我們上面說的那四個(gè)文件夾的配置了,注釋掉上面的配置,啟動(dòng)看看
spring: resources: static-locations: classpath:/static/
啟動(dòng)訪問localhost:8080
不出意料的顯示的是static的標(biāo)題,也就是static文件夾下的html文件.
此時(shí)嘗試訪問3b.jpg,4b.jpb都是無法訪問的,只能訪問2b.jpg
靜態(tài)資源的配置心得
在springboot的application.properties中,下面2個(gè)配置是配置靜態(tài)資源的。
# 默認(rèn)值為 /** spring.mvc.static-path-pattern= # 默認(rèn)值為 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ spring.resources.static-locations=這里設(shè)置要指向的路徑,多個(gè)使用英文逗號(hào)隔開
上面的那個(gè)是匹配規(guī)則,換句話說,只有靜態(tài)資源滿足什么樣的匹配條件,Spring Boot才會(huì)處理靜態(tài)資源請(qǐng)求。
下面的是匹配后指向的路徑。也就是說 ,這個(gè)配置項(xiàng)是告訴springboot去哪找資源。
舉例
spring.mvc.static-path-pattern=/gw/**
如果原先訪問首頁(yè)的地址是:http://localhost:8080/index.html,那么在你配置這個(gè)配置后,上面的訪問就失效了,現(xiàn)在訪問同樣的頁(yè)面需要這樣訪問:http://localhost:8888/gw/index.html
配置訪問路徑為/gw/后原本可以訪問resources下其他文件夾的目錄下的靜態(tài)資源,現(xiàn)在不可以了。
比如下面截圖中pay.html不能訪問了,在沒有配置為/static/可以通過http://localhost:8080/pay.html訪問,注意地址欄。(測(cè)試時(shí),spring.mvc.static-path-pattern=/static/**)
實(shí)際springboot項(xiàng)目,一般會(huì)將js、css等靜態(tài)文件放在static下,而將頁(yè)面放在templates下。
使用:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(44)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07Netty搭建WebSocket服務(wù)器實(shí)戰(zhàn)教程
這篇文章主要介紹了Netty搭建WebSocket服務(wù)器實(shí)戰(zhàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03Spring boot使用spring retry重試機(jī)制的方法示例
這篇文章主要介紹了Spring boot使用spring retry重試機(jī)制的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決
本文主要介紹了SpringBoot事務(wù)異步調(diào)用引發(fā)的bug解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例
本篇文章主要介紹了Java時(shí)間輪算法的實(shí)現(xiàn)代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼
這篇文章主要介紹了Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼,需要的朋友可以參考下2017-12-12java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)
這篇文章主要給大家介紹了關(guān)于java使用@Scheduled注解執(zhí)行定時(shí)任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Java+Nginx實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù)
本篇文章的內(nèi)容是介紹Java+Nginx如何實(shí)現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù),步驟詳細(xì),思路清新,需要的朋友可以參考下2015-07-07