Static Resources

此选项提供了一种方便的方法来基于一组https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/Resource.html[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" />

资源处理程序还支持一组https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/resource/ResourceResolver.html[ResourceResolver] 实现和https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/resource/ResourceTransformer.html[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、JSP、FreeMarker 和其他依赖于 HttpServletResponse#encodeURL 的 URL 标记的组件透明地重写。

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

对于 WebJars,推荐使用版本化 URL,例如`/webjars/jquery/1.2.0/jquery.min.js`,并且是使用它们的最有效方法。上述资源位置在 Spring Boot 外部已配置(或可通过`ResourceHandlerRegistry`手动进行配置),并且无需添加`org.webjars:webjars-locator-core`依赖项。

通过 WebJarsResourceResolver 支持像 /webjars/jquery/jquery.min.js 这样的非版本化 URL,当 org.webjars:webjars-locator-core 库存在类路径中时,该解析器会自动注册,而代价是可能会减慢应用程序启动的类路径扫描。该解析器可以重写 URL 以包含 JAR 的版本,并且还可以匹配不带版本号的传入 URL——例如,从 /webjars/jquery/jquery.min.js 匹配到 /webjars/jquery/1.2.0/jquery.min.js

基于 ResourceHandlerRegistry 的 Java 配置提供了更多针对细粒度控制的选项,例如,最后修改行为和优化的资源解析。