spring boot项目中的静态资源文件存放在static文件下面,当通过浏览器访问这些静态文件时,发现必须要添加static作为前缀才能访问,折腾了一番后发现,这个前缀跟 spring.mvc.static-path-pattern
这个配置项有关。
1 | /static/** = |
项目中application.properties
配置文件中,存在如上配置项时,访问静态资源文件要加static才行,当把这个配置项除掉时,不用加static作为前缀亦可进行正常访问。
同时配置上下文路径为/
,如果存在上下文则需要在链接上添加上下文路径。
1 | / = |
代码追踪
当spring boot自动装配 org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,当执行到org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#addResourceHandlers方法时,类org.springframework.boot.autoconfigure.web.WebMvcProperties#staticPathPattern的默认值为 “/**”。如果配置项文件中存在spring.mvc.static-path-pattern 配置项,默认的配置项将会被覆盖。
当通过浏览器进行访问时,springMVC使用SimpleUrlHandlerMapping进行路由映射,当执行到方法 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#lookupHandler 时,将会使用 spring.mvc.static-path-pattern 配置项来匹配url
扩展
/static/**
与 /static/*
的区别
尽量使用前者,否则多层次路径会出现资源访问不到的情况。被这个问题坑了一个多小时。
spring.mvc.static-path-pattern 与 spring.resources.static-locations 区别
static-path-pattern: /static/** 这个配置就是在访问静态资源的路径前面追加static关键字。默认值是static-path-pattern: /** 。比如没有设置这个配置项之前,访问静态资源http://域名/test.js ;加了之后就要这样访问了 http://域名/static/test.js
当你的网关需要登录时,一般会使用Filter会根据url来匹配是否需要登录,当开启这个配置项时,只需要判断url 是否匹配 /static/** (集成Shiro的时候加上这个filterChainDefinitionMap.put("/static/**", "anon");
)如若匹配则不需要登录直接返回静态资源给前端
static-locations: classpath:/static,classpath:/templates
这个是用以指定存放静态资源的路径,查找静态资源时会从上面的路径下面开始搜索,没有找到会返回404
参考引用资料: