我正在尝试从浏览器上运行的代码中获取各种.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”访问。
答案 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
标头。