on the road

0%

Spring Boot配置spring.mvc.static-path-pattern

spring boot项目中的静态资源文件存放在static文件下面,当通过浏览器访问这些静态文件时,发现必须要添加static作为前缀才能访问,折腾了一番后发现,这个前缀跟 spring.mvc.static-path-pattern 这个配置项有关。

1
spring.mvc.static-path-pattern=/static/**

项目中application.properties配置文件中,存在如上配置项时,访问静态资源文件要加static才行,当把这个配置项除掉时,不用加static作为前缀亦可进行正常访问。

同时配置上下文路径为/,如果存在上下文则需要在链接上添加上下文路径。

1
server.servlet.context-path=/

代码追踪

当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

参考引用资料:

https://www.cnblogs.com/yql1986/p/9219137.html