|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
静态资源
此选项提供了一种便捷的方式,用于从基于
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,以便可以将其注入到其他组件中。您还可以通过 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 依赖。
通过 /webjars/jquery/jquery.min.js 支持无版本的 URL(例如 WebJarsResourceResolver)。当 classpath 中存在 org.webjars:webjars-locator-core 库时,该解析器会自动注册,但代价是进行 classpath 扫描,可能会减慢应用程序的启动速度。该解析器可以重写 URL 以包含 JAR 包的版本号,也可以匹配不带版本号的传入 URL——例如,将 /webjars/jquery/jquery.min.js 映射到 /webjars/jquery/1.2.0/jquery.min.js。
基于 ResourceHandlerRegistry 的 Java 配置提供了更多细粒度控制的选项,例如 last-modified 行为和优化的资源解析。 |