靜態資源
此選項提供了一種方便的方式,用於從 Resource
型別的位置列表中提供靜態資源。
在以下示例中,對於以 /resources
開頭的請求,相對路徑將用於查詢並提供相對於 Web 應用根目錄下 /public
或類路徑下 /static
的靜態資源。資源將使用一年後的過期時間來提供,以確保最大限度地利用瀏覽器快取並減少瀏覽器發起的 HTTP 請求。Last-Modified
資訊是根據 Resource#lastModified
推斷的,以便支援帶有 "Last-Modified"
頭的 HTTP 條件請求。
以下清單展示瞭如何實現:
-
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" />
另請參閱靜態資源的 HTTP 快取支援。
資源處理器還支援一系列 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
使重寫透明,該過濾器適用於依賴 HttpServletResponse#encodeURL
的 Thymeleaf、JSP、FreeMarker 等帶有 URL 標籤的檢視技術。
請注意,在使用 EncodedResourceResolver
(例如,用於提供 gzipped 或 brotli 編碼的資源)和 VersionResourceResolver
時,必須按照此順序註冊它們。這確保了基於內容的版本始終能可靠地計算,基於未編碼的檔案。
對於 WebJars,推薦且最高效的使用方式是版本化的 URL,例如 /webjars/jquery/1.2.0/jquery.min.js
。相關的資源位置在 Spring Boot 中開箱即用地配置好了(或者可以透過 ResourceHandlerRegistry
手動配置),並且不需要新增 org.webjars:webjars-locator-core
依賴。
不帶版本的 URL,例如 /webjars/jquery/jquery.min.js
,透過 WebJarsResourceResolver
提供支援。當類路徑中存在 org.webjars:webjars-locator-core
庫時,此解析器會自動註冊,代價是可能減慢應用啟動速度的類路徑掃描。解析器可以重寫 URL 以包含 Jar 的版本,並且還可以匹配傳入的不帶版本的 URL,例如從 /webjars/jquery/jquery.min.js
到 /webjars/jquery/1.2.0/jquery.min.js
。
基於 ResourceHandlerRegistry 的 Java 配置提供了更多精細控制的選項,例如最後修改行為和最佳化資源解析。 |