静态资源

此选项提供了一种方便的方式,可以从 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" />

资源处理程序还支持 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,以便可以将其注入到其他 bean 中。您还可以使用ResourceUrlEncodingFilter使重写变得透明,适用于 Thymeleaf、JSP、FreeMarker 等使用依赖于HttpServletResponse#encodeURL的 URL 标记的其他框架。

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

对于 WebJars,建议使用版本化的 URL(如/webjars/jquery/1.2.0/jquery.min.js)并将其用作最有效的方式。相关资源位置由 Spring Boot 开箱即用地配置(或可以通过ResourceHandlerRegistry手动配置),并且不需要添加org.webjars:webjars-locator-core依赖项。

无版本 URL(如/webjars/jquery/jquery.min.js)通过WebJarsResourceResolver支持,当org.webjars:webjars-locator-core库存在类路径中时,它会自动注册,但会以类路径扫描为代价,这可能会减慢应用程序启动速度。解析器可以重写 URL 以包含 jar 的版本,还可以匹配没有版本的传入 URL——例如,从/webjars/jquery/jquery.min.js/webjars/jquery/1.2.0/jquery.min.js

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