当前位置: 首页 > article >正文

随笔记录-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler

环境: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 方法判断一下,否则存在多个同名前缀,启动会报错

配置静态资源映射

创建名为resourceHandlerMapping的bean对象
创建一个resourceHandlerMapping的bean对象(SimpleUrlHandlerMapping
通过resourceHandlerMapping方法获取实例
WebMvcConfigurationSupport#resourceHandlerMapping
添加静态资源映射并转化为SimpleUrlHandlerMapping

→添加静态资源映射并转化为 SimpleUrlHandlerMapping ↑

ResourceHandlerRegistryaddResourceHandler 方法添加前缀匹配路径,addResourceLocations 添加本地映射路径。配置之后就保存了一份列表,当获取Mapping时,返回 SimpleUrlHandlerMapping
将配置的静态资源映射转化为Map

→将配置的静态资源映射转化为Map↑

获取bean之后,对bean对象进行初始化过程
初始化bean

→初始化bean↑

初始化方法,就是判断是否 实现 InitializingBean 接口 和 配置initMethod方法名(@Bean的initMethod、xml的init-method属性)
a、实现 InitializingBean 接口,调用afterPropertiesSet方法
b、指定initMethod方法名,反射调用方法
初始化方法前后,通过 BeanPostProcessor 的applyBeanPostProcessorsBeforeInitialization和applyBeanPostProcessorsAfterInitialization方法分别前后处理

AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization(处理一些列BeanPostProcessor)
ApplicationContextAwareProcessor#postProcessBeforeInitialization
ApplicationContextAwareProcessor#invokeAwareInterfaces
ApplicationObjectSupport#setApplicationContext
ApplicationObjectSupport#initApplicationContext(org.springframework.context.ApplicationContext)
SimpleUrlHandlerMapping#initApplicationContext
SimpleUrlHandlerMapping#registerHandlers
AbstractUrlHandlerMapping#registerHandler(java.lang.String, java.lang.Object)
保存静态资源映射的handler

→缓存静态资源映射的handler供获取时使用↑

配置跨域

CorsRegistry 跨域支持配置

访问静态资源过程

获取handler

DispatcherServlet#doDispatch
DispatcherServlet#getHandler
获取handler
AbstractHandlerMapping#getHandler
AbstractUrlHandlerMapping#getHandlerInternal
AbstractUrlHandlerMapping#lookupHandler(java.lang.String, javax.servlet.http.HttpServletRequest)
获取匹配的前缀路径

→获取匹配的前缀路径↑

获取合适的handler

→获取目标handler↑

添加跨域配置

→目标handler添加跨域配置↑

准备执行handler

→准备执行handler↑

通过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协议的路径,会截取开头到最后一个“/”位置
file路径截取



http://www.kler.cn/a/144471.html

相关文章:

  • 【学习笔记】GameFramework的非官方实例TowerDefense-GameFramework-Demo的流程
  • BTS-GAN:基于MRI和条件对抗性网络的乳腺肿瘤计算机辅助分割系统
  • 【Pytorch】Visualization of Fature Maps(2)
  • RESTful
  • 3.读取字符串【2023.11.25】
  • Django(九、cookie与session)
  • laravel8安装多应用多模块(笔记三)
  • 数据库基础入门 — SQL排序与分页
  • 计数问题+约瑟夫问题(map)
  • 手写模拟Spring底层原理(Spring启动流程)(思维导图)
  • SQL 注入漏洞的理解
  • Python爬虫知识储备
  • AT89S52单片机智能寻迹小车自动红外避障趋光检测发声发光设计
  • 网安融合新进展:Check Point+七云网络联合研发,加固大型企业边缘、分支侧安全
  • Linux中安装MySQ-合集
  • 微服务实战系列之签名Sign
  • 网络运维与网络安全 学习笔记2023.11.22
  • 【计算机网络】(网络层)定长掩码和变长掩码
  • 『亚马逊云科技产品测评』活动征文|EC2 实例安装 docker 与配套软件部署前后端分离的医疗管理后台系统
  • spark数据倾斜的解决思路