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

前端跨域的解决方案(前端跨域解决方案cors设置星号)名词解释 跨域资源共享 Cross Origin Resource Sharing 简单说就是只要协议 IP http 方法任意一个不同就是跨域 spring MVC 自 4 2 开始添加了跨域的支持 跨域具体的定义请移步 mozilla 查看 spring mvc 中跨域使用有 3 种方式 在 web xml 中配置 CorsFilter 在 xml 中配置 使用注解 CorsConfigur

大家好,我是讯享网,很高兴认识大家。



名词解释:跨域资源共享(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

小讯
上一篇 2025-05-12 17:33
下一篇 2025-04-22 22:03

相关推荐

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