27.1.5. 静态内容
默认情况下,Spring Boot从classpath下的/static
(/public
,/resources
或/META-INF/resources
)文件夹,或从ServletContext
根目录提供静态内容。这是通过Spring MVC的ResourceHttpRequestHandler
实现的,你可以自定义WebMvcConfigurer
并覆写addResourceHandlers
方法来改变该行为(加载静态文件)。
在单机web应用中,容器会启动默认的servlet,并用它加载ServletContext
根目录下的内容以响应那些Spring不处理的请求。大多数情况下这都不会发生(除非你修改默认的MVC配置),因为Spring总能够通过DispatcherServlet
处理这些请求。
默认地,资源放置在/**
,但是你可以通过spring.mvc.static-path-pattern
属性进行调整。例如,迁移所有的资源到/resources/**
可以按照如下方式实现:
你可以设置spring.resources.static-locations
属性自定义静态资源的位置(配置一系列目录位置代替默认的值)。根Servlet的上下文路径“/”也会被作为一个位置自动添加。
此外,除了上述标准的静态资源位置,有个例外情况是Webjars内容。任何在/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-core
,否则所有的Webjars将解析为404
。
以下的配置为所有的静态资源提供一种缓存清除(cache busting)方案,实际上是将内容hash添加到URLs中,比如<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
:
注 实现该功能的是ResourceUrlEncodingFilter
,它在模板运行期会重写资源链接,Thymeleaf和FreeMarker会自动配置该filter,JSP需要手动配置。其他模板引擎还没自动支持,不过你可以使用ResourceUrlProvider自定义模块宏或帮助类。
当使用比如JavaScript模块加载器动态加载资源时,重命名文件是不行的,这也是提供其他策略并能结合使用的原因。下面是一个"fixed"策略,在URL中添加一个静态version字符串而不需要改变文件名:
使用以上策略,JavaScript模块加载器加载"/js/lib/"
下的文件时会使用一个固定的版本策略("/v12/js/lib/mymodule.js"
),其他资源仍旧使用内容hash的方式(<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>
)。查看ResourceProperties获取更多支持的选项。
最后更新于