Javascript 跨来源资源共享(CORS)概念
我对跨域JavaScript的概念有一个疑问 有一个服务器(例如amazon.com),在这个服务器中,只有选定的域才能使用其web服务。 所以,毫无疑问,如果我试图使用他们的服务,从我的本地,我不能。 我把这个放在控制台上了 已阻止跨源请求:同一源策略不允许读取 位于的远程资源 . 这可以通过将资源移动到同一域或域来解决 启用CORS PS:我也使用了jquery跨域的方式,但不起作用 但是,如果某个被选中的域(使用Amazon的Web服务)具有JavaScript,如果我们将其包含在html中,它就会工作Javascript 跨来源资源共享(CORS)概念,javascript,jquery,ajax,cors,Javascript,Jquery,Ajax,Cors,我对跨域JavaScript的概念有一个疑问 有一个服务器(例如amazon.com),在这个服务器中,只有选定的域才能使用其web服务。 所以,毫无疑问,如果我试图使用他们的服务,从我的本地,我不能。 我把这个放在控制台上了 已阻止跨源请求:同一源策略不允许读取 位于的远程资源 . 这可以通过将资源移动到同一域或域来解决 启用CORS PS:我也使用了jquery跨域的方式,但不起作用 但是,如果某个被选中的域(使用Amazon的Web服务)具有JavaScript,如果我们将其包含在html
<script src="http://example.com"></script>
他们有一种通过Ajax获得响应的方法
我的问题是:
CORS是必须在服务器上修改的设置。它允许外部域请求网页上的资源。简单地在客户机上更改代码不会更改CORS的功能 您可以从“脚本”标记内访问页面的原因是,标记的处理方式与跨源请求的所有其他数据不同。在过去,您可以使用JSONP将CORS“黑客”到您的系统上,JSONP将JSON数据存储在HTML标记中 要在Apache中启用CORS,请执行以下操作: 首先通过键入找到httpd.conf
ps -ef | grep apache
这将为您提供Apache的位置。找到该类型后:
<apache-location> -V
现在您需要转到httpd.conf并键入“/”以搜索
。找到标记后,请在其后面键入:
Header set Access-Control-Allow-Origin "*"
保存文件并通过运行以下命令确认语法正确:
apachectl -t
如果不符合要求,请运行优雅的重新启动命令:
apachectl -k graceful
一旦服务器重新启动,您的文件现在应该可以通过外部脚本访问
如果由于错误而无法保存配置,请尝试退出编辑器并键入:
sudo chmod 755 httpd.conf
这使所有者可以完全访问配置文件,但其他人只能读取一个execute-it()
要测试这些更改,请在外部服务器上创建一个新的index.html文件,并加载以下内容:
<!doctype html>
<html>
<head>
<title>TEST</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.18/angular.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<!-- Insert Scripts & CSS Here -->
<link rel="stylesheet" type="text/css" href="http://d1e24pw9mnwsl8.cloudfront.net/c/bootstrap/css/bootstrap.min.css">
</head>
<body>
<script>
jQuery.get('yourwebsite.com/file.csv', function(data) {
document.write(data);
});
</script>
</body>
</html>
这意味着a)您的httpd.conf配置不正确/未保存,或者b)您忘记重新启动web服务器 重要注意事项:如果另一端的服务器没有启用它,那么在客户端代码中就无法执行任何允许跨源ajax请求的操作 在回答你的问题之前,让我先介绍一下背景: 简单地说,同源安全策略确保一个来源的脚本不能从其他来源获取内容。现在,为了向大家解释起源的概念,让我引用其中的一部分: 下表概述了针对URL“”进行检查的典型结果 与其他浏览器不同,Internet Explorer在计算源代码时不包括端口,而是使用安全区域 因此,例如,您的JavaScript不能从web服务器下载任何内容(也就是,向web服务器发出HTTP请求),而不是从它起源的服务器下载。这就是为什么不能对其他域进行XmlHttpRequests(又名AJAX)的原因
CORS是另一端的服务器(而不是浏览器中的客户端代码)可以使用的一种方式 对……的过于简单的描述。 CORS标准的工作原理是添加新的HTTP头,允许服务器向允许的源域提供资源。浏览器支持这些标题并尊重它们所建立的限制 示例:假设您的站点是
http://my-cool-site.com
而且,您在域http://third-party-site.com
,您可以通过AJAX访问它
让我们假设您的服务器my cool site.com
中的一个页面向third party site.com
发出请求。通常情况下,用户浏览器会拒绝对除您自己的域/子域之外的任何其他站点的AJAX调用。但如果浏览器和第三方服务器支持CORS,则会发生以下情况:
- 浏览器将向
第三方站点.com
Origin: http://my-cool-site.com
- 如果第三方服务器接受来自您域的请求,它将使用
HTTP头进行响应:访问控制允许源站
Access-Control-Allow-Origin: http://my-cool-site.com
- 要允许所有域,第三方服务器可以发送此标头:
Access-Control-Allow-Origin: *
- 如果您的站点不被允许,浏览器将抛出一个错误
XDomainRequest
对象,而不是XMLHttpRequest
,才能进行调用,以使CORS正常工作;现在,所有现代浏览器(包括微软的浏览器)都在XMLHttpRequest
中处理COR。但如果您需要支持过时的浏览器,请说明:
要发出CORS请求,只需在Firefox 3.5+、Safari 4+和Chrome中使用XMLHttpRequest
,在IE8+中使用XDomainRequest
对象。当使用XMLHttpRequest
对象时,如果浏览器看到您试图发出跨域请求,它将无缝触发CORS行为
下面是一个javascript函数,可以帮助您创建跨浏览器的CORS对象
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
// XHR has 'withCredentials' property only if it supports CORS
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){ // if IE use XDR
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
同样,这只对过时的浏览器是必要的
以上原因就是您无法从脚本中使用Amazon的web服务的原因。亚马逊服务器将只允许将其JavaScript文件下载到从选定域提供服务的页面 要回答您的编号问题:
- 该文件将被下载
Access-Control-Allow-Origin: http://my-cool-site.com
Access-Control-Allow-Origin: *
function createCORSRequest(method, url){ var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr){ // XHR has 'withCredentials' property only if it supports CORS xhr.open(method, url, true); } else if (typeof XDomainRequest != "undefined"){ // if IE use XDR xhr = new XDomainRequest(); xhr.open(method, url); } else { xhr = null; } return xhr; }
Header set Access-Control-Allow-Origin *
MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', ... ]