名词解释:跨域资源共享(Cross-Origin Resource Sharing)
简单说就是只要协议、IP、http方法任意一个不同就是跨域。
spring MVC自4.2开始添加了跨域的支持。
跨域具体的定义请移步mozilla查看
spring mvc中跨域使用有3种方式:
在web.xml中配置CorsFilter
在xml中配置
使用注解
- CorsConfiguration 具体封装跨域配置信息的pojo
- CorsConfigurationSource request与跨域配置信息映射的容器
- CorsProcessor 具体进行跨域操作的类
- 诺干跨域配置信息初始化类
- 诺干跨域使用的Adapter
涉及的java类:
- 封装信息的pojo
CorsConfiguration - 存储request与跨域配置信息的容器
CorsConfigurationSource、UrlBasedCorsConfigurationSource - 具体处理类
CorsProcessor、DefaultCorsProcessor - CorsUtils
- 实现OncePerRequestFilter接口的Adapter
CorsFilter - 校验request是否cors,并封装对应的Adapter
AbstractHandlerMapping、包括内部类PreFlightHandler、CorsInterceptor - 读取CrossOrigin注解信息
AbstractHandlerMethodMapping、RequestMappingHandlerMapping - 从xml文件中读取跨域配置信息
CorsBeanDefinitionParser - 跨域注册辅助类
MvcNamespaceUtils
要看懂代码我们需要先了解下封装跨域信息的pojo–CorsConfiguration
这边是一个非常简单的pojo,除了跨域对应的几个属性,就只有combine、checkOrigin、checkHttpMethod、checkHeaders。
属性都是多值组合使用的。
combine是将跨域信息进行合并
3个check方法分别是核对request中的信息是否包含在允许范围内
配置初始化
在系统启动时通过CorsBeanDefinitionParser解析配置文件;
加载RequestMappingHandlerMapping时,通过InitializingBean的afterProperties的钩子调用initCorsConfiguration初始化注解信息;
配置文件初始化
在CorsBeanDefinitionParser类的parse方法中打一个断点。


CorsBeanDefinitionParser的调用栈
通过代码可以看到这边解析中的定义信息。
跨域信息的配置可以以path为单位定义多个映射关系。
解析时如果没有定义则使用默认设置
解析完成后,通过MvcNamespaceUtils.registerCorsConfiguratoions注册
这边走的是spring bean容器管理的统一流程,现在转化为BeanDefinition然后再实例化。
注解初始化
在RequestMappingHandlerMapping的initCorsConfiguration中扫描使用CrossOrigin注解的方法,并提取信息。

RequestMappingHandlerMapping_initCorsConfiguration
跨域请求处理
HandlerMapping在正常处理完查找处理器后,在AbstractHandlerMapping.getHandler中校验是否是跨域请求,如果是分两种进行处理:
- 如果是预请求,将处理器替换为内部类PreFlightHandler
- 如果是正常请求,添加CorsInterceptor拦截器
拿到处理器后,通过请求头是否包含Origin判断是否跨域,如果是跨域,通过UrlBasedCorsConfigurationSource获取跨域配置信息,并委托getCorsHandlerExecutionChain处理
UrlBasedCorsConfigurationSource是CorsConfigurationSource的实现,从类名就可以猜出这边request与CorsConfiguration的映射是基于url的。getCorsConfiguration中提取request中的url后,逐一验证配置是否匹配url。
通过请求头的http方法是否options判断是否预请求,如果是使用PreFlightRequest替换处理器;如果是普通请求,添加一个拦截器CorsInterceptor。
PreFlightRequest是CorsProcessor对于HttpRequestHandler的一个适配器。这样HandlerAdapter直接使用HttpRequestHandlerAdapter处理。
CorsInterceptor 是CorsProcessor对于HnalderInterceptorAdapter的适配器。
可以去github查看: https://github.com/haplone/spring_doc/blob/master/mvc/cors.md

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/163738.html