跨域读取阻止 (CORB)

我使用Jquery AJAX调用了第三方API。我在控制台中收到以下错误:

跨源读取阻止 (CORB) 阻止了使用 MIME 类型 application/json 的跨源响应 MY URL。有关更多详细信息,请参阅 https://www.chromestatus.com/feature/5629709824032768

我使用以下代码进行Ajax调用:

$.ajax({
  type: 'GET',
  url: My Url,
  contentType: 'application/json',
  dataType:'jsonp',
  responseType:'application/json',
  xhrFields: {
    withCredentials: false
  },
  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  success: function(data) {
    console.log(data);
  },
  error: function(error) {
    console.log("FAIL....=================");
  }
});

当我签入Fiddler时,我得到了响应的数据,但没有在Ajax成功方法中。

请帮帮我。


答案 1
 dataType:'jsonp',

您正在发出 JSONP 请求,但服务器正在使用 JSON 进行响应。

浏览器拒绝尝试将 JSON 视为 JSONP,因为这将带来安全风险。(如果浏览器确实尝试将JSON视为JSONP,那么它充其量会失败)。

有关 JSONP 的更多详细信息,请参阅此问题。请注意,这是一个令人讨厌的黑客攻击,用于解决在 CORS 可用之前使用的同源策略。CORS 是一种更清洁、更安全、更强大的解决方案。


看起来你正在尝试提出一个跨源请求,并将你能想到的一切抛在一堆相互冲突的指令中。

您需要了解同源策略的工作原理。

有关深入的指南,请参阅此问题


现在,我们来谈谈您的代码的一些注意事项:

contentType: 'application/json',
  • 当您使用 JSONP 时,将忽略此问题
  • 您正在发出 GET 请求。没有用于描述其类型的请求正文。
  • 这将使跨域请求变得不简单,这意味着除了基本的 CORS 权限外,您还需要处理预检。

删除它。

 dataType:'jsonp',
  • 服务器未使用 JSONP 进行响应。

删除它。(您可以改为使用 JSONP 使服务器响应,但 CORS 更好)。

responseType:'application/json',

这不是jQuery.ajax支持的选项。删除它。

xhrFields: { withCredentials: false },

这是默认设置。除非您使用 ajaxSetup 将其设置为 true,否则请将其删除。

  headers: {
    'Access-Control-Allow-Credentials' : true,
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Allow-Methods':'GET',
    'Access-Control-Allow-Headers':'application/json',
  },
  • 这些是响应标头。它们属于响应,而不是请求。
  • 这将使跨域请求变得不简单,这意味着除了基本的 CORS 权限外,您还需要处理预检。

答案 2

在大多数情况下,阻止的响应不应影响网页的行为,并且可以安全地忽略 CORB 错误消息。例如,当被阻止的响应的正文已经为空时,或者当响应将被传递到无法处理它的上下文时(例如,HTML文档(例如,404错误页面被传递到标记),则可能会发生警告。

https://www.chromium.org/Home/chromium-security/corb-for-developers

我必须清理浏览器的缓存,我正在阅读此链接,如果请求得到空响应,我们会收到此警告错误。我在我的请求上得到了一些CORS,所以这个请求的响应是空的,我所要做的就是清除浏览器的缓存,CORS就离开了。我收到CORS是因为chrome已将PORT号保存在缓存上,服务器将接受,而我正在这样做,因为缓存。localhost:3010localhost:3002