跨域问题之 Spring 的跨域的方案
跨域问题之 Spring 的跨域的方案
@CrossOrigin
@CrossOrigin 可以添加到方法上,也可以添加到 Controller 上
AbstractHandlerMethodMapping 的内部类 MappingRegistry 的 register:
@CrossOrigin 注解在 AbstractHandlerMethodMapping 的内部类 MappingRegistry 的 register 方法中完成解析,@CrossOrigin 注解中的内容会被解析成一个配置对象 CorsConfiguration
将 @CrossOrigin 所标记的请求方法对象 HandlerMethod 和 CorsConfiguration 一一对应存入 corsLookup 的 map 集合中
当请求到达 DispatcherServlet 的 doDispatch 方法之后,调用 AbstractHandlerMapping 的 getHandler 方法获取执行链 HandlerExecutionChain 时,会从 map 中获取 CorsConfiguration 对象
根据获取到的 CorsConfiguration 对象构建一个 CorsInterceptor 拦截器
在 CorsInterceptor 拦截器中触发对 CorsProcessor 的 processRequest 方法调用,跨域请求的校验工作将在该方法中完成。
addCorsMappings
@CrossOrigin 是添加在不同的 Controller 中 全局配置
全局配置和 @CrossOrigin 注解相同,都是在 CorsInterceptor 拦截器中触发对 CorsProcessor 的 processRequest 方法调用,最终在该方法中完成跨域请求的校验工作
registry.addMapping("/**")方法中配置了一个 CorsRegistration 对象,该对象中包含了一个路径拦截规则,同时 CorsRegistration 还包含了一个 CorsConfiguration 配置对象,该对象用来保存这里跨域相关的配置。
在 WebMvcConfigurationSupport 的 requestMappingHandlerMapping 方法中触发了 addCorsMappings 方法执行,将获取到的 CorsRegistration 对象重新组装成一个 UrlBasedCorsConfigurationSource 对象,该对象保存了拦截规则和 CorsConfiguration 对象的映射关系。
将新建的 UrlBasedCorsConfigurationSource 对象赋值给 AbstractHandlerMapping 的 corsConfigurationSource 属性
当请求到达时的处理方法和 @CrossOrigin 注解处理流程一样,在 AbstractHandlerMapping 的 getHandler 方法处理,从 corsConfigurationSource 中获取 CorsConfiguration 配置对象,而 @CrossOrigin 从 map 中获取 CorsConfiguration 对象。如果两处都可以获取到 CorsConfiguration 对象,则获取到的对象属性值进行合并。
根据获取到的 CorsConfiguration 对象构造 CorsInterceptor 拦截器
在 CorsInterceptor 拦截器中触发对 CorsProcessor 的 processRequest 方法调用,跨域请求的校验工作将在该方法中完成。
这里的跨域校验是通过 DispatcherServlet 中的方法触发的,DispatcherServlet 在 Filter 之后执行
CorsFIlter
手动创建 CorsConfiguration 对象
创建 UrlBasedCorsConfigurationSource 对象,将过滤器的拦截规则和 CorsConfiguration 对象之间的映射关系由 UrlBasedCorsConfigurationSource 中的 corsConfiguration 变量保存起来。
最后创建 CorsFilter 设置优先级
CorsFilter 的 doFilterInternal 方法:
触发对 CorsProcessor 的 processRequest 方法调用,跨域请求的校验工作将在该方法中完成
版权声明: 本文为 InfoQ 作者【周杰伦本人】的原创文章。
原文链接:【http://xie.infoq.cn/article/2450b3d612992f25e9f4fc7d1】。文章转载请联系作者。
评论