对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
静态资源
此选项提供了一种方便的方式来提供列表中的静态资源Resource
基于位置。
在下一个示例中,给定一个以/resources
,则相对路径为用于查找和提供相对于/public
在 Web 应用程序下root 或在类路径上/static
. 这些资源的未来为一年过期以确保最大限度地利用浏览器缓存并减少 HTTP 请求由浏览器制作。 这Last-Modified
信息是从Resource#lastModified
以便 HTTP 条件请求支持"Last-Modified"
头。
以下列表显示了如何使用 Java 配置执行此作:
-
Java
-
Kotlin
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)));
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public", "classpath:/static/")
.setCacheControl(CacheControl.maxAge(Duration.ofDays(365)))
}
}
以下示例显示了如何在 XML 中实现相同的配置:
<mvc:resources mapping="/resources/**"
location="/public, classpath:/static/"
cache-period="31556926" />
另请参阅对静态资源的 HTTP 缓存支持。
资源处理程序还支持ResourceResolver
implementations 和ResourceTransformer
实现 您可以使用它来创建用于处理优化资源的工具链。
您可以使用VersionResourceResolver
对于基于 MD5 哈希的版本控制资源 URL根据内容、固定应用程序版本或其他计算。 一个ContentVersionStrategy
(MD5 哈希)是一个不错的选择——但有一些值得注意的例外,例如与模块加载器一起使用的 JavaScript 资源。
以下示例演示如何使用VersionResourceResolver
在 Java 配置中:
-
Java
-
Kotlin
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
@Configuration
@EnableWebMvc
class WebConfig : WebMvcConfigurer {
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
registry.addResourceHandler("/resources/**")
.addResourceLocations("/public/")
.resourceChain(true)
.addResolver(VersionResourceResolver().addContentVersionStrategy("/**"))
}
}
以下示例显示了如何在 XML 中实现相同的配置:
<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 并应用完整的解析器链和transformers — 例如,插入版本。MVC 配置提供了一个ResourceUrlProvider
bean 的 be,以便它可以注入到其他人中。您还可以使用ResourceUrlEncodingFilter
对于 Thymeleaf、JSP、FreeMarker 和其他具有 URL 标签的 恃HttpServletResponse#encodeURL
.
请注意,当同时使用EncodedResourceResolver
(例如,用于提供 gzip 压缩或brotli 编码的资源)和VersionResourceResolver
,则必须按此顺序注册它们。这可确保始终根据未编码的文件可靠地计算基于内容的版本。
对于 WebJars,版本化 URL (例如/webjars/jquery/1.2.0/jquery.min.js
是推荐且最有效的使用方式。相关资源位置是使用 Spring Boot 配置的(或者可以配置手动通过ResourceHandlerRegistry
),并且不需要添加org.webjars:webjars-locator-core
Dependency。
无版本 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 提供更多选项用于细粒度控制,例如上次修改的行为和优化的资源分辨率。 |