首頁 > 軟體

SpringBoot靜態資源的存取方法詳細介紹

2022-10-02 14:01:31

一. 靜態資源

在web場景中的靜態圖片、html網頁等

二. 靜態資源存取目標

在SpringBoot中,靜態資源存取目標有 resources檔案下的 public、resources、static 以及 META-INF 資料夾下的 recources

如下圖所示:

(注意資料夾要自己建立,不要寫錯名字!!!名字是固定的,就這幾個)

三. 靜態資源存取字首

1. 預設存取路徑為 /

放於上述資料夾下的靜態資源可以直接在根目錄下存取

如下:以存取qqVeiw.jpg為例

2. 設定存取字首

為什麼需要:在Request存取以及靜態資源存取同名時,SpringBoot會存取優先存取Request請求

因此,需要給靜態資設定存取字首,設定方法非常簡單,只需在yaml組態檔中加入如下:

spring:
  mvc:
    static-path-pattern: /res/** #靜態資源存取字首為res

如下圖:

3. 設定靜態資源預設存取位置

我們可以設定一個或多個自定義資料夾為靜態資源預設存取位置(陣列形式),只需在yaml組態檔中加入如下:

spring:
  resources:
    static-locations: [classpath:/haha/, classpath/static/] #在類路徑的haha資料夾下的靜態資源才能被存取到

四. 歡迎頁及網頁圖示設定

1. 歡迎頁的設定

只需將 index.html 網頁加入設定的static-locations中,再去存取根目錄,就可以看到SpringBoot為我們設定好的歡迎頁

(1)yaml檔案設定

(2)index.html加入靜態資源存取目標

spring:
  resources:
    static-locations: [classpath:/haha/] #在類路徑的haha資料夾下的靜態資源才能被存取到

2. 網頁圖示的設定

將命名為favicon.ico的圖示加入靜態資源存取目錄

注意: 若設定了存取字首,則上述兩功能不生效使用設定網頁圖示功能,要開啟禁用瀏覽器快取功能

分析原始碼

WelcomePageHandlerMapping類

1. 實現 歡迎頁

		public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
				FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
			WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
					new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
					this.mvcProperties.getStaticPathPattern());
			welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
			welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
			return welcomePageHandlerMapping;
		}

2.實現靜態資源存取

		public void addResourceHandlers(ResourceHandlerRegistry registry) {
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
			CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
			if (!registry.hasMappingForPattern("/webjars/**")) {
				customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
						.addResourceLocations("classpath:/META-INF/resources/webjars/")
						.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
			}
			String staticPathPattern = this.mvcProperties.getStaticPathPattern();
			if (!registry.hasMappingForPattern(staticPathPattern)) {
				customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
						.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
						.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
			}
		}

繼續往下走——

WelcomePageHandlerMapping類

實現歡迎頁

	WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
			ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {
			// 從這裡我們也可以看出來為什麼歡迎頁不能加靜態資源存取字首
		if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {
			logger.info("Adding welcome page: " + welcomePage.get());
			setRootViewName("forward:index.html");
		}
		else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
			logger.info("Adding welcome page template: index");
			setRootViewName("index");
		}
	}

到此這篇關於SpringBoot靜態資源的存取方法詳細介紹的文章就介紹到這了,更多相關SpringBoot靜態資源的存取內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com