当前位置:网站首页 > 前端开发 > 正文

前端跨域的解决方案(前端跨域解决方案cors设置星号)



名词解释:跨域资源共享(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方法中打一个断点。

spring设置跨域不起作用_web.xml

spring设置跨域不起作用_测试_02

CorsBeanDefinitionParser的调用栈

通过代码可以看到这边解析中的定义信息。

跨域信息的配置可以以path为单位定义多个映射关系。

解析时如果没有定义则使用默认设置

解析完成后,通过MvcNamespaceUtils.registerCorsConfiguratoions注册

这边走的是spring bean容器管理的统一流程,现在转化为BeanDefinition然后再实例化。

注解初始化

在RequestMappingHandlerMapping的initCorsConfiguration中扫描使用CrossOrigin注解的方法,并提取信息。

spring设置跨域不起作用_java_03

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

到此这篇前端跨域的解决方案(前端跨域解决方案cors设置星号)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 前端工程师面试技巧(前端工程师面试应该具有什么能力)2024-12-30 15:18:07
  • 前端跨域请求(前端跨域请求头)2024-12-30 15:18:07
  • 前端工程化(前端工程化包括哪些方面)2024-12-30 15:18:07
  • 前端工程师面经(前端工程师的面试题)2024-12-30 15:18:07
  • 前端富文本框(前端富文本框上传图片)2024-12-30 15:18:07
  • 前端跨域解决方案设计(前端跨域产生的原因和解决方法)2024-12-30 15:18:07
  • 前端跨域问题 302(前端跨域问题最简单三个步骤)2024-12-30 15:18:07
  • 前端跨域配置(前端跨域配置最简单三个步骤)2024-12-30 15:18:07
  • 前端埋点插件(前端埋点插件怎么用)2024-12-30 15:18:07
  • 前端埋点(前端埋点插件)2024-12-30 15:18:07
  • 全屏图片