静态资源
此选项提供了一种方便的方式,用于从 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 配置提供了更多精细控制的选项,例如最后修改行为和优化资源解析。 |