Firefox 中的跨站点 XmlHttpRequest?
Posted
技术标签:
【中文标题】Firefox 中的跨站点 XmlHttpRequest?【英文标题】:cross-site XmlHttpRequest in Firefox? 【发布时间】:2010-09-28 09:54:27 【问题描述】:我了解(我认为)XmlHttpRequest 对象遵守“同域”策略。但是,我想创建一个简单的 (POC) 本地 html 文件,该文件从 Web 服务器下载 XML 并对其进行处理(让我们从一个简单的“alert()”开始)。
有可能吗?我需要特殊的 Firefox 配置选项吗?
我尝试下载的服务器不在我的控制之下(它实际上是一个 Google API)。
我的简单尝试是来自Mozilla's "Using XMLHttpRequest" page 的代码。它从“发送”方法返回一个我不太了解的错误。
免责声明:我主要是一名 C/C++ 开发人员 - 从未做过任何严肃的 JS 编程,从未尝试过使用这些 API。
【问题讨论】:
我在另一个线程中回答了一个解决 Firefox 限制的解决方案:***.com/questions/330427/… 【参考方案1】:XMLHttpRequest 实际上遵循更严格的相同域策略实现:虽然您可以设置 document.domain 属性以允许来自两个子域的 javascript 相互通信,但您不能使用 XMLHttpRequestObject 来做到这一点。在你的情况下,去一个完全不同的域,你也不能用 JavaScript 做到这一点。
有几个选项。首先,您可以使用反向代理使外部站点看起来是您站点的子域。看看 Apache 的 mod_proxy,特别是 ProxyPassReverse
另一种选择是将数据作为 JSON 对象返回:
我还建议您使用 Google 搜索“google mashup”。其中大部分位于“googlemashops.com”域上,这使得实施变得更加容易。一些人住在该领域之外,可能会给你一些想法。
编辑:我建议不要直接使用XMLHttpRequest对象,而是通过prototype.js等第三方库
【讨论】:
【参考方案2】:如果您尝试检索的 XML 由 Google 的 JS API 之一返回,则不需要 XmlHttpRequest(因为它只能在与您的页面相同的域中使用)。
因此,在使用 Google API(例如 Maps API)的情况下,通常首先在您页面的某处添加对其通用 API 的引用:
<script type="text/javascript" src="http://www.google.com/jsapi?key=your_google_api_key"></script>
然后在页面中添加对您计划使用的特定 API 的引用:
<script type="text/javascript">google.load("maps", "2");</script>
现在您可以调用该 API 提供的各种函数:
<script type="text/javascript">
function initialize()
var map = new google.maps.Map2(document.getElementById("map"));
map.setCenter(new google.maps.LatLng(41.86, 87.68), 13);
google.setOnLoadCallback(initialize);
</script>
不需要 XmlHttpRequest :)
【讨论】:
我尝试使用的 API 实际上直接返回一个 JSON 对象。但是该对象没有名称,那么我该如何使用它呢?如果您已登录 Google 阅读器,请参阅:google.com/reader/api/0/unread-count?output=json【参考方案3】:或者尝试使用 IE8。如果您从磁盘而不是网站运行,IE8 将忽略所有正常的域限制并获取您想要的数据。
【讨论】:
【参考方案4】:您可以使用 JSONP 来执行此操作。我使用 jQuery 和 php 来完成 here。基本上我使用 PHP 代理来包装 JSON 回复,以便 jQuery 可以处理它。它在BSD下。
【讨论】:
【参考方案5】:使用 jQuery(可能还有 XHR,但我尽量不直接使用它)你可以愉快地进行跨域请求,前提是你不指定不寻常的标头或非 GET 方法。如果您确实想使用这些,您必须控制服务器以启用 OPTIONS 请求。
详情请见https://developer.mozilla.org/En/HTTP_access_control。
【讨论】:
以上是关于Firefox 中的跨站点 XmlHttpRequest?的主要内容,如果未能解决你的问题,请参考以下文章
Playframework 中的跨站点脚本和 Web 参数篡改预防
防止 asp.net Web 表单中的跨站点请求伪造 (csrf) 攻击
Set-cookie 不适用于 Dot net Core 3.1 中的跨站点请求/响应和 React 设置同站点 cookie 和/或 CORS 问题