ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
# 27.1.5 静态内容 默认情况下,Spring Boot从classpath下的`/static`(`/public`,`/resources`或`/META-INF/resources`)文件夹,或从`ServletContext`根目录提供静态内容。这是通过Spring MVC的`ResourceHttpRequestHandler`实现的,你可以自定义`WebMvcConfigurerAdapter`并覆写`addResourceHandlers`方法来改变该行为(加载静态文件)。 在单机web应用中,容器会启动默认的servlet,并用它加载`ServletContext`根目录下的内容以响应那些Spring不处理的请求。大多数情况下这都不会发生(除非你修改默认的MVC配置),因为Spring总能够通过`DispatcherServlet`处理这些请求。 你可以设置`spring.resources.staticLocations`属性自定义静态资源的位置(配置一系列目录位置代替默认的值),如果你这样做,默认的欢迎页面将从自定义位置加载,所以只要这些路径中的任何地方有一个`index.html`,它都会成为应用的主页。 此外,除了上述标准的静态资源位置,有个例外情况是[Webjars内容](http://www.webjars.org/)。任何在`/webjars/**`路径下的资源都将从jar文件中提供,只要它们以Webjars的格式打包。 **注** 如果你的应用将被打包成jar,那就不要使用`src/main/webapp`文件夹。尽管该文件夹是通常的标准格式,但它仅在打包成war的情况下起作用,在打包成jar时,多数构建工具都会默认忽略它。 Spring Boot也支持Spring MVC提供的高级资源处理特性,可用于清除缓存的静态资源或对WebJar使用版本无感知的URLs。 如果想使用针对WebJars版本无感知的URLs(version agnostic),只需要添加`webjars-locator`依赖,然后声明你的Webjar。以jQuery为例,`"/webjars/jquery/dist/jquery.min.js"`实际为`"/webjars/jquery/x.y.z/dist/jquery.min.js"`,`x.y.z`为Webjar的版本。 **注** 如果使用JBoss,你需要声明`webjars-locator-jboss-vfs`依赖而不是`webjars-locator`,否则所有的Webjars将解析为`404`。 以下的配置为所有的静态资源提供一种缓存清除(cache busting)方案,实际上是将内容hash添加到URLs中,比如`<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>`: ```text spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/** ``` **注** 实现该功能的是`ResourceUrlEncodingFilter`,它在模板运行期会重写资源链接,Thymeleaf,Velocity和FreeMarker会自动配置该filter,JSP需要手动配置。其他模板引擎还没自动支持,不过你可以使用[ResourceUrlProvider](http://docs.spring.io/spring/docs/4.3.3.RELEASE/javadoc-api/org/springframework/web/servlet/resource/ResourceUrlProvider.html)自定义模块宏或帮助类。 当使用比如JavaScript模块加载器动态加载资源时,重命名文件是不行的,这也是提供其他策略并能结合使用的原因。下面是一个"fixed"策略,在URL中添加一个静态version字符串而不需要改变文件名: ```text spring.resources.chain.strategy.content.enabled=true spring.resources.chain.strategy.content.paths=/** spring.resources.chain.strategy.fixed.enabled=true spring.resources.chain.strategy.fixed.paths=/js/lib/ spring.resources.chain.strategy.fixed.version=v12 ``` 使用以上策略,JavaScript模块加载器加载`"/js/lib/"`下的文件时会使用一个固定的版本策略`"/v12/js/lib/mymodule.js"`,其他资源仍旧使用内容hash的方式`<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>`。查看[ResourceProperties](https://github.com/spring-projects/spring-boot/tree/v1.4.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java)获取更多支持的选项。 **注** 该特性在一个专门的[博文](https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources)和Spring框架[参考文档](https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources)中有透彻描述。