Spring Boot中的静态资源映射使用详解

deer332025-02-01技术文章55

静态资源通常包括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 提供了开箱即用的静态资源映射功能,通过少量配置就可以满足大部分的应用静态文件配置需求,通过自定义的配置操作可以对资源映射进行进一步的配置。