靜態資源

此選項提供了一種便捷的方式,可從基於 Resource 的位置清單中提供靜態資源。

在下一個範例中,如果請求以 /resources 開頭,則相對路徑用於尋找和提供相對於 Web 應用程式根目錄下的 /public 或類路徑下 /static 的靜態資源。資源以一年後的過期時間提供,以確保最大程度地利用瀏覽器快取並減少瀏覽器發出的 HTTP 請求。Last-Modified 資訊是從 Resource#lastModified 推斷出來的,以便 HTTP 條件請求支援 “Last-Modified” 標頭。

以下清單顯示如何執行此操作

  • Java

  • Kotlin

  • Xml

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/resources/**")
				.addResourceLocations("/public", "classpath:/static/")
				.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
	}
}
@Configuration
class WebConfiguration : WebMvcConfigurer {

	override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
		registry.addResourceHandler("/resources/**")
			.addResourceLocations("/public", "classpath:/static/")
			.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)))
	}
}
<mvc:resources mapping="/resources/**" location="/public, classpath:/static/"
			   cache-period="31556926" />

資源處理器還支援 ResourceResolver 實作和 ResourceTransformer 實作的鏈,您可以使用它們來建立用於處理最佳化資源的工具鏈。

您可以使用 VersionResourceResolver 針對基於從內容計算出的 MD5 雜湊值、固定的應用程式版本或其他版本的資源 URL。ContentVersionStrategy (MD5 雜湊值) 是一個不錯的選擇,但有一些值得注意的例外,例如與模組載入器一起使用的 JavaScript 資源。

以下範例顯示如何使用 VersionResourceResolver

  • Java

  • Kotlin

  • Xml

@Configuration
public class VersionedConfiguration implements WebMvcConfigurer {

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/resources/**")
				.addResourceLocations("/public/")
				.resourceChain(true)
				.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
	}
}
@Configuration
class VersionedConfiguration : WebMvcConfigurer {

	override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
		registry.addResourceHandler("/resources/**")
			.addResourceLocations("/public/")
			.resourceChain(true)
			.addResolver(VersionResourceResolver().addContentVersionStrategy("/**"))
	}
}
<mvc:resources mapping="/resources/**" location="/public/">
	<mvc:resource-chain resource-cache="true">
		<mvc:resolvers>
			<mvc:version-resolver>
				<mvc:content-version-strategy patterns="/**"/>
			</mvc:version-resolver>
		</mvc:resolvers>
	</mvc:resource-chain>
</mvc:resources>

然後,您可以使用 ResourceUrlProvider 重寫 URL 並應用解析器和轉換器的完整鏈,例如,插入版本。MVC 組態提供了一個 ResourceUrlProvider Bean,以便可以將其注入到其他 Bean 中。您也可以使用 ResourceUrlEncodingFilter 為 Thymeleaf、JSP、FreeMarker 和其他具有依賴 HttpServletResponse#encodeURL 的 URL 標籤的技術,使重寫透明化。

請注意,當同時使用 EncodedResourceResolver (例如,用於提供 gzipped 或 brotli 編碼的資源) 和 VersionResourceResolver 時,您必須按此順序註冊它們。這可確保始終基於未編碼的檔案可靠地計算基於內容的版本。

對於 WebJars,建議且最有效的使用方式是使用版本化的 URL,例如 /webjars/jquery/1.2.0/jquery.min.js。相關的資源位置已在 Spring Boot 中預先設定 (或可以通過 ResourceHandlerRegistry 手動設定),並且不需要新增 org.webjars:webjars-locator-core 相依性。

通過 WebJarsResourceResolver 支援無版本 URL,例如 /webjars/jquery/jquery.min.js,當類路徑上存在 org.webjars:webjars-locator-core 函式庫時,會自動註冊該解析器,但會以類路徑掃描為代價,這可能會減慢應用程式啟動速度。解析器可以重寫 URL 以包含 jar 的版本,並且還可以比對沒有版本的傳入 URL,例如從 /webjars/jquery/jquery.min.js/webjars/jquery/1.2.0/jquery.min.js

基於 ResourceHandlerRegistry 的 Java 組態提供了更精細控制的其他選項,例如,上次修改行為和最佳化的資源解析。