静态资源
此选项提供了一种方便的方式,可以从基于资源的列表中提供静态资源。
在下一个示例中,给定一个以 /resources 开头的请求,会使用相对路径来查找并提供静态资源。这些资源是相对于 Web 应用程序根目录下的 /public 或类路径(classpath)中的 /static 来定位的。提供的资源会设置一年的过期时间,以确保最大限度地利用浏览器缓存,并减少浏览器发出的 HTTP 请求数量。Last-Modified 信息是从 Resource#lastModified 中获取的,这样就可以通过设置 „Last-Modified“ 标头来支持 HTTP 条件请求(conditional requests)了。
以下列表展示了如何做到这一点:
- 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,以便可以将其注入到其他组件中。你还可以通过 ResourceUrlEncodingFilter 使重写过程变得透明,该过滤器适用于 Thymeleaf、JSPs、FreeMarker 以及那些依赖于 HttpServletResponse#encodeURL 的带 URL 标签的模板引擎。
请注意,当同时使用EncodedResourceResolver(例如,用于提供压缩或brotli编码的资源)和VersionResourceResolver时,必须按照此顺序进行注册。这样可以确保基于内容的版本号始终能够根据未编码的文件可靠地计算得出。
对于 WebJars,使用如 /webjars/jquery/1.2.0/jquery.min.js 这样的版本化 URL 是推荐且最高效的用法。Spring Boot 默认已经配置好了相关资源的定位(或者也可以通过 ResourceHandlerRegistry 手动配置),因此无需额外添加 org.webjars:webjars-locator-lite 依赖。
像 /webjars/jquery/jquery.min.js 这样的无版本号URL,可以通过 WebJarsResourceResolver 来支持。当类路径中存在 org.webjars:webjars-locator-lite 库时,该解析器会自动注册。该解析器能够重新编写URL以包含jar的版本号,同时也能匹配不带版本号的传入URL——例如,将 /webjars/jquery/jquery.min.js 匹配为 /webjars/jquery/1.2.0/jquery.min.js。
基于ResourceHandlerRegistry的Java配置提供了更多用于精细控制的选项,例如最后修改时间行为和优化的资源解析。