用于获取.js内容的CORS - Javascript

时间:2017-05-03 06:52:33

标签: javascript xmlhttprequest cors

我正在尝试从浏览器上运行的代码中获取各种.js文件的内容(通过插件)。

使用XMLHttpRequest获取驻留在同一服务器上的.js文件没有问题,但是当我需要获取其他域上的.js文件的内容时,我正在尝试使用CORS但是我似乎无法让它工作

这是我的代码

// Create the XHR object.
function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    // XHR for Chrome/Firefox/Opera/Safari.
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") {
    // XDomainRequest for IE.
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    // CORS not supported.
    xhr = null;
  }
  return xhr;
}

// Make the actual CORS request.
function makeCorsRequest(url) {

  var xhr = createCORSRequest('GET', url);
  if (!xhr) {
    alert('CORS not supported');
    return;
  }

  // Response handlers.
  xhr.onload = function() {
    return xhr.responseText;
  };

  xhr.onerror = function() {
    alert('There was an error making the request.');
  };

  xhr.send();
}

当我跑步时:

url = `https://......./javascript.js'
res = makeCORSTRequest(url)

我收到'发出请求时出错“。错误警报和控制台记录

  

XMLHttpRequest无法加载https://......./javascript.js。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。因此,不允许原点“https://.....com”访问。

1 个答案:

答案 0 :(得分:2)

当您发出请求的服务器明确表示他们选择接收跨源请求时,您的浏览器只会让您的前端JavaScript代码访问来自跨源请求的响应,而他们通过发送{ {1}}响应中的响应标头。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS有更多详情。

如果站点从不发送Access-Control-Allow-Origin响应标头,那么您将能够通过使用CORS代理获取站点跨源的内容的唯一方法。有关详细信息,请参阅"No 'Access-Control-Allow-Origin' header is present on the requested resource"上的答案。

浏览器是唯一对跨源请求实施限制的客户端,它们只在Web应用程序上强制实施。

这就是为什么即使你看到 No' Access-Control-Allow-Origin'标头出现在请求的资源上。因此,在您的devtools控制台中不允许访问消息,您仍然可以转到devtools中的“网络”选项卡并在那里查看响应。

那是因为服务器发送了响应并且浏览器已收到响应,但浏览器只是拒绝允许您的前端JavaScript代码访问响应,因为发送响应的服务器没有选择交叉-origin通过发送Access-Control-Allow-Origin响应标头请求。

当您从Python等发出请求时,您可以获得响应的原因是,除了浏览器之外,没有客户端拒绝允许您的代码在缺少Access-Control-Allow-Origin响应时访问响应头。但浏览器总会如此。

请注意,这些都不是服务器阻止或拒绝响应任何请求。服务器始终只是接收请求并发送响应。唯一的区别在于服务器是否在响应中发送Access-Control-Allow-Origin标头。