静态资源

此选项提供了一种方便的方式,可以从基于 Resource 的位置列表中提供静态资源。

在下一个示例中,对于以 /resources 开头的请求,相对路径用于查找并提供相对于 Web 应用程序根目录下的 /public 或类路径下的 /static 的静态资源。资源被提供具有一年未来的到期时间,以确保最大限度地利用浏览器缓存并减少浏览器发出的 HTTP 请求。Last-Modified 信息从 Resource#lastModified 推断出来,以便通过 Last-Modified 头支持 HTTP 条件请求。

以下列表展示了如何进行:

@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)));
  }
}

资源处理器还支持一系列 ResourceResolver 实现和 ResourceTransformer 实现, 您可以使用它们来创建一个工具链,用于处理优化的资源。

您可以使用 VersionResourceResolver 来获取基于内容的 MD5 哈希、固定应用程序版本或其他的版本化资源 URL。 ContentVersionStrategy(MD5 哈希)是一个不错的选择 — 除了一些显著的例外,例如与模块加载器一起使用的 JavaScript 资源。

以下示例展示了如何使用 VersionResourceResolver

@Configuration
public class VersionedConfiguration implements WebMvcConfigurer {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/public/")
            .resourceChain(true)
            .addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
  }
}

然后,您可以使用 ResourceUrlProvider 来重写 URL 并应用解析器和转换器的完整链 — 例如, 插入版本。MVC 配置提供了一个 ResourceUrlProvider Bean,以便可以注入到其他组件中。 您也可以使用 ResourceUrlEncodingFilter 使重写对 Thymeleaf、JSPs、FreeMarker 等使用 URL 标签并依赖于 HttpServletResponse#encodeURL 的组件透明。

注意,当同时使用 EncodedResourceResolver(例如,用于提供 gzipped 或 brotli-encoded 资源) 和 VersionResourceResolver 时,必须按此顺序注册它们。这确保基于内容的版本始终可靠地计算,基于未编码的文件。

对于 WebJars,推荐且最有效的使用方式是使用版本化的 URL,如 /webjars/jquery/1.2.0/jquery.min.js。 相关的资源位置在 Infra App 中已经配置好了(或者可以通过 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 配置提供了进一步的细粒度控制选项, 例如最后修改行为和优化的资源解析。