静态资源
此选项提供了一种便捷的方式,可以从 Resource
基于位置的列表中提供静态资源。
在下面的示例中,给定一个以/resources
开头的请求,相对路径用于查找和提供相对于 Web 应用程序根目录下的/public
或类路径下的/static
的静态资源。这些资源将使用一年后的过期时间提供,以确保最大限度地利用浏览器缓存并减少浏览器发出的 HTTP 请求。Last-Modified
信息是从Resource#lastModified
推断出来的,以便使用"Last-Modified"
头支持 HTTP 条件请求。
以下清单展示了如何使用 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
实现和 ResourceTransformer
实现,您可以使用它们来创建用于处理优化资源的工具链。
您可以使用VersionResourceResolver
来创建基于内容的 MD5 哈希、固定应用程序版本或其他内容的版本化资源 URL。ContentVersionStrategy
(MD5 哈希)是一个不错的选择,但有一些值得注意的例外,例如与模块加载器一起使用的 JavaScript 资源。
以下示例展示了如何在 Java 配置中使用VersionResourceResolver
-
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 并应用完整的解析器和转换器链,例如,插入版本。MVC 配置提供了一个ResourceUrlProvider
bean,以便它可以被注入到其他 bean 中。您还可以使用ResourceUrlEncodingFilter
(适用于 Thymeleaf、JSP、FreeMarker 等使用依赖于HttpServletResponse#encodeURL
的 URL 标签的框架)来使重写变得透明。
请注意,当同时使用EncodedResourceResolver
(例如,用于提供 gzip 或 brotli 编码的资源)和VersionResourceResolver
时,您必须按此顺序注册它们。这确保了基于内容的版本始终基于未编码的文件可靠地计算。
对于 WebJars,像/webjars/jquery/1.2.0/jquery.min.js
这样的版本化 URL 是使用它们的推荐方法,也是最有效的方法。相关的资源位置在 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 配置提供了更多选项,用于进行细粒度控制,例如最后修改行为和优化资源解析。 |