SpringBoot配置外部靜態(tài)資源映射問題
SpringBoot配置外部靜態(tài)資源映射
使用場景
實際項目中,特別是前后端分離的項目,SpringBoot后臺打包(jar包)后,以jar包形式直接啟動服務后,項目中包含的靜態(tài)資源則無法動態(tài)修改。
此時,需要配置一個外部的映射路徑來實現(xiàn)靜態(tài)資源訪問和修改、上傳功能等。
SpringBoot版本說明
版本:2.3.4.RELEASE
添加外部路徑配置
staticPath為自定義的外部資源物理路徑,放在配置文件中,如:D:/Tasks/
application.properties文件內容如下:
server.port=8086 server.servlet.context-path=/iserver spring.output.ansi.enabled=ALWAYS spring.mvc.static-path-pattern=/static/** spring.mvc.format.date=yyyy-MM-dd HH:mm:ss project.static = D:/Tasks/
配置映射
添加WebMvcConfig,如下:
import org.springframework.beans.factory.annotation.Value; 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; @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Value("${project.static}") private String staticPath; /** * 跨域 **/ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedHeaders("*") .allowedOrigins("*") .allowedMethods("POST","GET","PUT","OPTIONS","DELETE") .allowCredentials(true); } /** * 靜態(tài)資源處理 **/ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/file/**").addResourceLocations("file:" + staticPath); registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } }
測試訪問
在D盤新建Tasks文件夾,在新建js文件夾,存放jquery-3.1.1.min.js
正常啟動項目,在瀏覽器輸入地址: http://localhost:8086/iserver/file/js/jquery-3.1.1.min.js
SpringBoot靜態(tài)資源映射原理
HandlerMapping:處理器映射。保存了每一個Handler能處理哪些請求。
①靜態(tài)資源讀取
只要靜態(tài)資源放在類路徑下: /static、public 、/resources 、/META-INF/resources這四個類路徑目錄下,
則訪問 : 當前項目根路徑/ + 靜態(tài)資源名就可以讀取到這四個目錄下的靜態(tài)資源
原理: 靜態(tài)映射/
請求進來,先去找Controller看能不能處理。不能處理的所有請求又都交給靜態(tài)資源處理器。靜態(tài)資源也找不到則響應404頁面
②改變默認的靜態(tài)資源路徑
spring:
//這個修改用戶訪問服務器時資源映射的前綴(默認無前綴,即/+資源名可以直接訪問,現(xiàn)在需要加上前綴res/)
(但是這個修改資源映射前綴會導致歡迎頁和favicon失效,因為底層代碼是死代碼 / 映射到服務器靜態(tài)資源目錄中,而不是spring.mvc.static-path-pattern這個變量)
mvc:
static-path-pattern: /res/
//這個修改靜態(tài)資源在服務器的默認存放路徑(默認是/static/,/public/,/resources/、META-INF/resouces/)
resources:
static-locations: [classpath:/haha/]
③靜態(tài)資源映射底層原理
靜態(tài)資源映射自動配置類地址–
/web/servlet/WebMvcAutoConfiguration
解析一:**
當配置文件中設置
則循環(huán)進去,下面配置的所有靜態(tài)資源映射規(guī)則不生效
解析二:
可以在配置文件中設置靜態(tài)資源的緩存規(guī)則,比如設置瀏覽器緩存靜態(tài)資源的時長
解析三:
將外部訪問/webjars/的請求映射到/META-INF/resources/webjars/
即外界訪問/webjars/jquery/3.5.1/jquery.js就可以直接訪問到這個路徑下的jquery.js
解析四:
首先獲取到配置文件中設置的static-Path-Pattern設置的靜態(tài)資源訪問路徑,如果沒有設置,則默認為/**
這個訪問路徑映射對應服務器中的以下路徑
所以靜態(tài)資源放在上述四個目錄(而這些目錄也是可以在配置文件中修改的)中時,外界訪問/+資源名,相當于在這四個目錄中尋找要找的資源
④歡迎頁的處理規(guī)則
解析一:
點進WelcomePageHandlerMapping構造器方法中
從中可以看到,只有歡迎頁存在,并且staticPathPattern等于/**時,才能夠使用歡迎頁功能
否則調用能處理index請求的controller
⑤favicon原理
favicon是瀏覽器自動向服務器發(fā)送請求/favicon.ico請求來設置頁面圖標,和代碼沒什么關系,所以當修改了配置文件中的staticPathPattern時,/favicon.ico不能夠在服務器找到對應前綴目錄下的favicon.ico,自然設置不了頁面圖標
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫
這篇文章介紹了IDEA使用JDBC安裝配置jar包連接MySQL數(shù)據(jù)庫的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-01-01Java?精煉解讀數(shù)據(jù)結構的鏈表的概念與實現(xiàn)
鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針連接次序實現(xiàn)的,每一個鏈表都包含多個節(jié)點,節(jié)點又包含兩個部分,一個是數(shù)據(jù)域,一個是引用域2022-03-03詳解關于eclipse中使用jdk15對應javafx15的配置問題總結
這篇文章主要介紹了詳解關于eclipse中使用jdk15對應javafx15的配置問題總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11Java序列化框架Kryo高效轉換對象為字節(jié)流面試精講
這篇文章主要為大家介紹了Java序列化框架Kryo高效轉換對象為字節(jié)流面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10java天數(shù)計算函數(shù)(當前月天數(shù)、某月總天數(shù)及某月剩余天數(shù))4種方法實現(xiàn)代碼
日常開發(fā)中會遇到關于日期的計算,比如當月的天數(shù)、兩日期之間的天數(shù)、當月剩余天數(shù)等等,這篇文章主要給大家介紹了關于java天數(shù)計算函數(shù)(當前月天數(shù)、某月總天數(shù)及某月剩余天數(shù))4種方法實現(xiàn)的相關資料,需要的朋友可以參考下2023-10-10