我可以向另一个域发出 XMLHttpRequest 吗?

Posted

技术标签:

【中文标题】我可以向另一个域发出 XMLHttpRequest 吗?【英文标题】:Can I make an XMLHttpRequest to another domain? 【发布时间】:2010-09-24 09:26:03 【问题描述】:

有没有办法将 XMLHttpRequest 与其他域结合使用?

我想在不使用服务器的情况下从 Google 解析一些 xml,因此运行起来非常简单。

var req = getXmlHttpRequestObject();
...
req.open('GET', 'http://www.google.de/ig/api?weather=Braunschweig', true);
        req.setRequestHeader("Content-Type","text/xml");
        req.onreadystatechange = setMessage;
        req.send(null);

在服务器端这样做是没有选择的,至少我不必问

【问题讨论】:

【参考方案1】:

不,不是现在。我相信我读到计划/设计正在由标准组织为未来制定,因此我们可以安全地做到这一点。

否则,跨站点脚本漏洞将十分猖獗。

JSONP 是一个可能的解决方案,如果其他站点 API 支持的话。

【讨论】:

【参考方案2】:

html5 现在支持 XmlHttpRequest 级别 2 的跨域请求,看看:

http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

【参考方案3】:

这是一个安全问题,大多数(所有?)浏览器都不允许您这样做。您可以使用隐藏的 IFrame 进行提取,但它足够复杂,我只需要使用服务器(或者切换到不同的语言,如果我不必在浏览器中运行)

【讨论】:

即使使用隐藏的 iframe,您仍然无法获取来自其他域的内容。【参考方案4】:

您不能进行跨域请求,例如由于客户端(浏览器)的安全问题,通过 XMLHttpRequest 或 jQuery(它是 XMLHttpRequest 的包装器)从 example1.com 到 example2.com。这在支持HTML5的现代浏览器中可以通过CORS(跨源资源共享)有效实现,并不是每个客户端浏览器都可以使用。所以解决方法是在example2.com的example1.com中插入script标签,这个解决方案是众所周知的作为 JSON-P(带填充的 JSON),名称可能会产生误导,因为数据可以是服务器提供的任何格式(example2.com)。其实现代码在此链接中给出http://newtechinfo.net/jsonp-for-cross-domain-ajax/

【讨论】:

【参考方案5】:

这是不可能的,因为如今浏览器采用 SOP(同源策略)来限制 XSS 攻击。 您将不得不使用服务器端脚本(php 之类的)。

【讨论】:

【参考方案6】:

可以使用 HTML5 向另一个域发出 XHR。当通过 HTTP 与另一个网站通信时,您也可以使用 XHR 发出不同的协议请求。

【讨论】:

【参考方案7】:

您可以尝试在服务器端做一些事情。因此,在您的应用程序中,您向远程站点发出请求,获取结果并将其返回给您的客户端。然后,AJAX 调用只会调用您自己的服务器并且可以正常工作。

【讨论】:

以上是关于我可以向另一个域发出 XMLHttpRequest 吗?的主要内容,如果未能解决你的问题,请参考以下文章

捕获 XMLHttpRequest 跨域错误

Javascript XMlHttprequest 到另一个域

如何使用客户的 IP 地址向另一个网站发出请求?

SilverStripe:如何向另一个网站发出 HTTP 请求?

从一个进程向另一个 C++ 发出信号

Flask-socketio,向另一个命名空间发出事件