Spring Boot中的静态资源映射使用详解
静态资源通常包括HTML、CSS、JavaScript、图片、字体等内容,在Spring Boot中提供了一种简单而强大的静态资源方式,结合Spring Boot的自动配置,可以快速实现静态资源的管理和访问。下面我们就来详细介绍一下Spring Boot静态资源映射配置。
默认静态资源映射
在默认情况下Spring Boot会将面这些位置配置的静态资源映射到根目录/下,如下所示。
- /src/main/resources/static
- /src/main/resources/public
- /src/main/resources/resources
- /src/main/resources/META-INF/resources
只要将相关的资源文件放在上述位置的目录中,Spring Boot就会对这些静态资源文件进行加载,例如。
- src/main/resources/static/style.css -> /style.css
- src/main/resources/public/index.html -> /index.html
注意:如果同名文件存在于多个位置,Spring Boot 会按照上述顺序优先加载。
自定义静态资源路径
如果需要自定义静态资源路径,我们可以在SpringBoot的配置文件中通过spring.web.resources.static-locations 属性来进行调整,如下所示。
spring.web.resources.static-locations=classpath:/custom-static/, file:/opt/app/static/- classpath:/custom-static/ 表示项目内部的 src/main/resources/custom-static。
- file:/opt/app/static/ 表示外部文件系统中的 /opt/app/static 目录。
除了上面的自定义的资源映射,Spring Boot中还可以对静态资源进行缓存配置,在默认情况下,静态资源会被默认缓存并且返回ETag或Last-Modified响应头,这个时候,我们就可以通过如下的配置来调整静态文件的缓存操作。
spring.web.resources.cache.period=3600 # 缓存时间(秒)
spring.web.resources.chain.cache=true # 是否启用缓存链静态资源优先级
在默认情况下,Spring Boot会先对是否存在静态资源文件与请求路径进行匹配,如果找不到静态资源文件的时候,才会转发给控制器来进行处理,这种情况下,可以通过调整Spring MVC配置来改变,如下所示。
如果希望控制器优先处理请求,可以在配置类中重写以下方法来实现。
Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}静态资源映射原理
Spring Boot的静态资源映射是基于Spring MVC的ResourceHttpRequestHandler实现。其操作流程如下所示。
当一个请求到达时,Spring MVC的DispatcherServlet会判断请求是否匹配静态资源的路径。如果匹配,则交由ResourceHttpRequestHandler处理。
而ResourceHttpRequestHandler会从spring.web.resources.static-locations配置的路径中查找对应的资源。如果找到,则将资源返回给客户端;否则,继续交给其他处理器或返回404。
高级自定义配置
添加拦截器
如果在实际使用场景中,需要对静态资源请求进行拦截,我们可以通过自定义拦截器来进行处理,如下所示。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**");
}
}映射到外部目录
如果在项目实现中,我们需要从文件系统中去加载静态的配置文件,例如图片配置代理场景,我们可以直接对文件路径进行映射,如下所示。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**")
.addResourceLocations("file:/opt/app/static/");
}
}上述配置会将 /files/** 映射到/opt/app/static目录中进行资源访问。
总结
Spring Boot 提供了开箱即用的静态资源映射功能,通过少量配置就可以满足大部分的应用静态文件配置需求,通过自定义的配置操作可以对资源映射进行进一步的配置。