Spring boot项目设置加载静态资源的路径

787 阅读2分钟

springboot加载静态资源亲身经历:

背景:

项目有个需要播放视频的需求,视频暂时存储在服务器的某个目录上。

操作过程

springboot 自动配置管理

spring:
  web:
    resources:
      static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/images/,classpath:/html/,classpath:/css/,classpath:/js/,classpath:/templates/,file:home/video/
  mvc:
    static-path-pattern: test/**

1、设置静态资源映射路径 test/开头的访问,都是访问资源文件。

2、设置静态资源目录,设置多个,最后一个 file:home/video home/video是存储视频的目录。

简单操作下来,自测访问目录的某个视频地址,结果404了,找不到文件。

开始排查为何访问不到静态资源(思考)

1、配置方式不对(网上都是这么玩的,细究源码好像也是这么扫描的)。

2、某些操作覆盖了spring的自动配置的方式。

流程一:创建一个新项目,在配置文件直接放入上述配置,启动项目,访问对应目录的视频文件。 发现视频可以正常播放,所以排除配置不对的问题。

于是思考是否某个操作覆盖了自动配置,我们知道static-path-pattern 是我们访问服务接口映射的地址,例如我们访问http://localhost:8080/test/** 这样的请求都是走我们的静态资源。

静态资源路径有static-locations 配置,支持访问多个路径

Springboot将从class目录中按如下优先级(从高到低)加载对应前端静态资源 1.class目录下static目录 2.class目录下public目录 3.class目录下resource目录 4.class目录下/META-INF/resources

通过设置spring.resources.static-locations自定义Spring boot加载前端静态资源路径 spring.resources.static-locations: file:D:/public/ 亦可以指定先后顺序: spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resource

静态资源的其他配置方式

配置静态资源除了上述通过配置,还可以通过显示的声明拦截器方式

image.png 通过设置上述拦截器,经测试可以正常访问静态资源文件。

原因大概是spring.resources.static-locations失效了,具体哪个设置导致的,查看代码没找到设置资源映射器的地址。暂时搁置了。

失效的两种场景

**如果指定了拦截器,该属性有可能失效 需要在拦截器ResourceHandlerRegistry中通过addLocations()指定对应路径。

如果指定@EnableWebMvc注解也会导致spring.resources.static-locations失效。如果使用@EnableWebMvc,会自动覆盖原有静态文件目录为src/main/webapp,如果要指定原静态文件目录,需重写addResourceHandlers方法**