CORS 错误详解

一、什么是CORS?

CORS(Cross-Origin Resource Sharing)是一种机制,它使用额外的HTTP头来告诉浏览器,让运行在一个origin (domain) 的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源在请求时,它使用一个GET、POST或是HEAD方法,然后这个资源响应一个HTTP头,表示允许特定的源来访问该资源,从而实现在不同域之间(协议、域名、端口号)进行安全地数据传输。

二、CORS的场景

CORS适用于XMLHttpRequest或Fetch API发出的请求,用于跨域访问其它域名下的数据,典型的场景有:

  • Web前端应用程序发出跨域AJAX请求,比如一个设置在a.com域名下的Web应用请求b.com域名下的资源。
  • CORS也适用于Web前端框架客户端应用程序与API客户端服务之间的跨域调用。

三、CORS的请求头和响应头

1、请求头:

Origin: http://a.com

2、响应头:

Access-Control-Allow-Origin: http://a.com
Access-Control-Allow-Headers: *, Authorization
Access-Control-Allow-Methods: *
Access-Control-Allow-Credentials: true

四、CORS的错误码

1、简单请求时,出现以下情况会产生CORS错误码:

  • 请求方式不是GET、HEAD、POST,如PUT、DELETE等。
  • 请求头信息不是以下几种,参考HTTP规范中的“列出的首部字段”:
  •     Accept
        Accept-Language
        Content-Language
        Last-Event-ID
        Content-Type(仅限于部分值)
        
  • 请求使用了HTTP身份验证信息。
  • 请求包含cookie信息。
  • 请求的Content-Type不正确。

2、复杂请求时,出现以下情况会产生CORS错误码:

  • 请求方法并不是GET/POST/HEAD。
  • 发送了POST请求,但不是以下类型之一:
  •     application/x-www-form-urlencoded
        multipart/form-data
        text/plain
        
  • 设置了自定义请求头,服务器没有在响应中添加对应头信息。
  • 请求中包含的Origin值和服务器所在的域不匹配。
  • 服务器没有响应Access-Control-Allow-Origin头。
  • 服务器响应中没有Access-Control-Allow-Methods头、Access-Control-Allow-Headers头或Access-Control-Max-Age头。
  • 可能是因为跨域设置了Credentials属性,但后台没有响应Access-Control-Allow-Credentials: true

五、CORS错误的解决方法

CORS错误解决分两种情况:一种是服务端提供跨域支持,一种是在前端搭配后端提供跨域支持,该解决方法大体分为以下几种:

1、服务端提供跨域支持。

在服务器端添加 Access-Control-Allow-Origin头部,可允许特定的源访问该资源,并可在头部添加允许的 HTTP 方法和响应头域。

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    header("Access-Control-Allow-Origin: http://a.com");
    header("Access-Control-Allow-Headers: *, Authorization");
    header("Access-Control-Allow-Methods: *");
    header('Access-Control-Allow-Credentials: true');
    exit;
}
header("Access-Control-Allow-Origin: http://a.com");
header('Access-Control-Allow-Credentials: true');

2、前端搭配后端提供跨域支持。

在前端发起请求时,设置请求头:

const xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.open('GET', 'http://b.com/api', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('Cookie', document.cookie)
xhr.setRequestHeader('Authorization', auth);
xhr.send();

在后端返回请求响应时,设置响应头:

header('Access-Control-Allow-Origin: http://a.com');
header('Access-Control-Allow-Headers: *, Authorization');
header('Access-Control-Allow-Methods: *');
header('Access-Control-Allow-Credentials: true');
echo $responseBody;

六、CORS错误码实际案例

1、ERR_TOO_MANY_REDIRECTS:重定向次数过多,通常是请求被拦截。

2、ERR_FAILED:通常是请求超时,或者是服务器内部错误。

3、ERR_TUNNEL_CONNECTION_FAILED:WebSocket服务请求失败。

4、ERR_ABORTED:用户主动中断请求。

5、ERR_CONNECTION_REFUSED:请求被服务器拒绝,通常是跨域问题导致。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/283145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-22 08:07
下一篇 2024-12-22 08:07

相关推荐

  • Python载入Cookie错误解决方法用法介绍

    本文将从多个方面详细阐述Python载入Cookie错误的解决方法,希望能对读者有所帮助。 一、Cookie错误常见原因 1、Cookie过期:当Cookie过期时,载入Cooki…

    编程 2025-04-29
  • Treck TCP/IP Stack 输入验证错误漏洞CVE-2020-11901解析

    本文将对Treck TCP/IP Stack 输入验证错误漏洞CVE-2020-11901进行详细解析,并提供相关代码示例。 一、漏洞背景 Treck TCP/IP Stack是一…

    编程 2025-04-27
  • electron-egg打包后请求地址错误解决方法用法介绍

    本文将从多个方面对electron-egg打包后请求地址错误进行详细阐述,并给出解决方法。 一、electron-egg打包后请求地址错误的表现 在使用 electron-egg …

    编程 2025-04-27
  • 解决OkHttp Invalid Input错误:Content-Type错误或不受支持

    如果您在使用OkHttp时遇到了”OkHttp Invalid Input. The Content-Type is missing or not supported …

    编程 2025-04-27
  • Python中冒号错误怎么办

    对于Python初学者来说,冒号是一种非常常用的符号,在Python语言中表示代码块的开始和结束。但是,很多时候,我们会因为书写不规范或者其他原因而出现冒号错误,导致代码无法正常运…

    编程 2025-04-27
  • C#全局错误捕获

    C#全局错误捕获是指在程序执行过程中遇到异常时,程序能够自动捕获并进行处理的机制。该机制可以让程序员更快地定位和解决错误,提高程序的稳定性和可靠性。 一、全局错误捕获的作用 1、提…

    编程 2025-04-27
  • 解决ERP运行时错误429:ActiveX不能创建对象 DAO350

    ERP运行时错误429是由于“ActiveX不能创建对象”而引发的。这种错误通常是由于您在尝试访问Microsoft Access数据库时缺少了必要的组件。 一、安装并注册DAO库…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论