2011-11-30 96 views
2

我试图请求位于另一个域/服务器上的数据,但当我尝试发送请求时收到异常。请求在另一个域/服务器上的内容

var request = new XMLHttpRequest(); 
request.open("GET", "http://www.w3schools.com/ajax/cd_catalog.xml", false); 
request.send(); 

错误:

uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)" nsresult: "0x80004005 (NS_ERROR_FAILURE)"]

这是正确的方式来请求内容是不一样的域/服务器上?或者有其他方法可以实现这一目标吗?

我在firefox 8.0中测试了这个,但我想要一个适用于所有主流现代浏览器的解决方案。

回答

2

您无法直接从其他域检索内容。您可以通过为您执行作业的服务器(代理)或使用类似JSONP的内容检索内容。检查这个wikipedia page

有关主题的额外信息,this page可能是有趣

1

其跨域请求时,它总是使用服务器上的代理进行。您创建一个服务器请求,并使用JavaScript

var request = new XMLHttpRequest(); 
request.open("GET", "abc.aspx"); 
request.send(); 
2

这就是所谓的跨域Ajax大多数浏览器认为这是一个安全违规调用http://www.w3schools.com/ajax/cd_catalog.xml像abc.apsx该网页上,并呼吁自己的abc.aspx。一种解决方法是创建一个服务器端组件(与您正在查看的页面相同的域),它将请求来自其他服务器(您的案例中的/www.w3schools.com)的数据并将其回显给您的Ajax请求。

这些链接会解释这个问题和几个解决方案:

http://jimbojw.com/wiki/index.php?title=Introduction_to_Cross-Domain_Ajaxrequest

http://usejquery.com/posts/the-jquery-cross-domain-ajax-guide

3

出于安全原因,这样的请求将无法正常工作。想象一下,如果任何域名可以访问任何其他域名的数据 - 您最终会得到任何网站(例如www.sketchyattacksite.com)能够从任何其他网站(例如www.bankofamerica.com)提取任意内容,包括经过身份验证的用户保密会话信息。由所有现代浏览器实施的same origin policy存在以防止发生这种安全侵害。

有几个常见的方式,以绕过同源策略:

  1. 你请求的数据从可以返回上述数据为JSONP(加载它,它可以让就好像它是一个外部域脚本,不受同一起源策略的限制)。通常,网站会在其API中提供JSONP格式,例如:https://graph.facebook.com/cocacola?callback=name_of_function_to_pass_data_via_jsonp
  2. Cross-Origin Resource Sharing (CORS)是最新的标准,因此只能在较新的浏览器中使用,但允许网站指定(通过HTTP标头)允许哪些域访问它们的域数据。例如,如果美国银行出于某种原因希望允许www.sketchyattacksite.com向www.bankofamerica.com发出请求,他们可能会返回Access-Control-Allow-Origin: sketchyattacksite.com标题。
  3. 一个服务器端代理。您可以在您的服务器上创建一个处理程序,其唯一功能是检索您的目标文件http://www.w3schools.com/ajax/cd_catalog.xml并将其返回到您的域。请注意,这样可以解决可能传递机密数据的问题,因为您的服务器(无法访问w3schools.com上的用户cookie)不是由用户的浏览器发出请求来执行的。

在这种特殊情况下,它看起来像服务器端代理#3就是答案。为什么?因为您无法控制网站的数据(这意味着您无法利用#1或#2的优势,除非w3schools.com自己选择实施它们)。这是simple PHP example of a serverside proxy,由雅虎提供!关键在于它被锁定只能从特定的域中获取内容(这样,不良的角色就不能将它用于代表您的任意请求),除此之外,它就像通过请求目标URL一样简单卷曲并将其返回给用户。请注意,您可能还需要添加缓存,以防止您的服务器端代理的每次加载都会触发http://www.w3schools.com/ajax/cd_catalog.xml文件的新请求。

相关问题