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
静态资源的其他配置方式
配置静态资源除了上述通过配置,还可以通过显示的声明拦截器方式
通过设置上述拦截器,经测试可以正常访问静态资源文件。
原因大概是spring.resources.static-locations失效了,具体哪个设置导致的,查看代码没找到设置资源映射器的地址。暂时搁置了。
失效的两种场景
**如果指定了拦截器,该属性有可能失效 需要在拦截器ResourceHandlerRegistry中通过addLocations()指定对应路径。
如果指定@EnableWebMvc注解也会导致spring.resources.static-locations失效。如果使用@EnableWebMvc,会自动覆盖原有静态文件目录为src/main/webapp,如果要指定原静态文件目录,需重写addResourceHandlers方法**