【问题标题】:Cross-Origin resource sharing and file://跨域资源共享和file://
【发布时间】:2011-07-05 12:21:39
【问题描述】:

我正在编写一个 HTML5 应用程序,它使用 JSONP 从几个不同的来源收集数据。我用 GET 做的任何事情都很完美。我现在正在尝试发布数据,但遇到了一个有趣的障碍。我需要将数据从我的应用程序发布到另一个,我的应用程序在本地机器上运行。我正在尝试编写一个支持跨平台的移动应用程序(想想 Pulse/Flipboard),因此代码将始终从本地源运行。我的思考过程如下:

我所针对的所有浏览器都是基于 webkit 的(iPad、Playbook、Android),所以我想知道在同一源策略代码中是否有任何我可以偷偷通过的吱吱声?也许使用 iframe 或 postMessage 的东西?

【问题讨论】:

  • “这导致请求失败(XmlHttpRequest错误:Access-Control-Allow-Origin不允许Origin null)” - 在当前浏览器中是允许的,所以问题已经过时了.
  • 能否详细说明第三个项目符号?我想我和你有同样的问题,但我不明白如何使用其他服务器。

标签: javascript ajax json html jsonp


【解决方案1】:

这个 Javascript 库几乎可以肯定地为您提供帮助:

http://easyxdm.net/

easyXDM 是一个 Javascript 库 使您作为开发人员能够轻松 解决设置的限制 同源政策的地方,在 让沟通变得容易 跨域公开 javascript API 边界。

..

easyXDM 的核心提供了一个 能够通过的运输栈 两个之间基于字符串的消息 windows,消费者(主要 文件)和提供者(文件 包括使用 iframe)。它确实 这通过使用几个可用的之一 技术,总是选择最 对当前浏览器有效的一种。 对于所有实现,传输 堆栈提供双向性, 可靠性,排队和 发件人验证。

【讨论】:

  • 感谢您的链接!这看起来确实很酷,但它与我正在寻找的东西并不特别匹配。它看起来像基于现代 webkit 的浏览器,因为我的目标是移动平台,所以它们对窗口通信的回答是 HTML5 postMessage 方法。这仅在应用程序的双方都在发布和接收消息时才有效。
【解决方案2】:

事实证明,最简单的方法是发布到 iframe 内的目标 url。大多数浏览器上的同源策略允许您从一个域执行 HTTP POST 到另一个不相关的域。我通过向我的页面添加 iframe 解决了这个问题,最初设置为本地引导页面。由于该页面是从同一个域加载的,因此我可以通过脚本对其进行控制。我用它来将表单发布到我的目标站点,并轮询结果以确定我的呼叫是否成功。它并不优雅,但很有效。

【讨论】: