環境:springboot-2.7.5
配置文件配置靜態資源映射
springboot配置靜態資源映射方式是通過 WebMvcAutoConfiguration 實現的
spring:
# resources:
# # 自springboot 2.5.5之后,該屬性已經被廢棄,使用spring.web.resources.static-locations代替
# static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:E:/images/# 靜態資源配置mvc:# 靜態資源訪問接口前綴static-path-pattern: /static/**web:resources:# 靜態資源本地路徑static-locations: classpath:/static/,classpath:/META-INF/resources/,classpath:/META-INF/resources/webjars/,file:E:/images/
該方式僅支持一種前綴匹配(spring.mvc.static-path-pattern)
自定義靜態資源映射
可以繼承 WebMvcConfigurationSupport 或者 WebMvcConfigurer 接口。
建議:
a、無須覆蓋原有的靜態資源,實現 WebMvcConfigurer 接口
b、需要覆蓋靜態資源,繼承 WebMvcConfigurationSupport 類,重寫所有資源映射
注意:
a、繼承 WebMvcConfigurationSupport 類時,WebMvcAutoConfiguration 配置 和 其他所有實現 WebMvcConfigurer 接口的的配置都失效
b、實現 WebMvcConfigurer 接口時,最好通過 ResourceHandlerRegistry#hasMappingForPattern 方法判斷一下,否則存在多個同名前綴,啟動會報錯
配置靜態資源映射
ResourceHandlerRegistry 中 addResourceHandler
方法添加前綴匹配路徑,addResourceLocations
添加本地映射路徑。配置之后就保存了一份列表,當獲取Mapping時,返回 SimpleUrlHandlerMapping,
配置跨域
CorsRegistry 跨域支持配置
訪問靜態資源過程
獲取handler
DispatcherServlet#doDispatch
DispatcherServlet#getHandler
AbstractHandlerMapping#getHandler
AbstractUrlHandlerMapping#getHandlerInternal
AbstractUrlHandlerMapping#lookupHandler(java.lang.String, javax.servlet.http.HttpServletRequest)
通過handler解析路徑
DispatcherServlet#doDispatch
HttpRequestHandlerAdapter#handle
ResourceHttpRequestHandler#handleRequest
PathResourceResolver#getResource(java.lang.String, javax.servlet.http.HttpServletRequest, java.util.List<? extends org.springframework.core.io.Resource>)
FileUrlResource#createRelative
UrlResource#createRelativeURL
new java.net.URL#URL(java.net.URL, java.lang.String)
StreamHandler#parseURL
org.springframework.http.converter.AbstractHttpMessageConverter#write
備注:
java.net.URLStreamHandler#parseURL解析url時,file協議的路徑,會截取開頭到最后一個“/”位置