有没有办法绕过Javascript / jQuery的同源策略以实现本地访问?

9

尝试使用ajaxgetJSON等函数从本地(非服务器)开发计算机获取外部URL。有没有办法绕过同源策略,以便我可以在本地进行测试,而不必上传到服务器?

8个回答

6

以下是简单的答案:chrome --disable-web-security

从源代码(chrome_switches.h)中可以看到:

// Don't enforce the same-origin policy.  (Used by people testing their sites.)
const char kDisableWebSecurity[]            = "disable-web-security";

我想使用jquery.js向运行在8080端口的Google Apps python服务器发送AJAX调用。只是为了测试,我希望在同一台机器上运行浏览器和服务器。
我不明白所有的安全细节,但对于临时开发来说,这似乎是一个合理的解决方案。只要我只在测试时使用chrome标志,就不应该有问题。
以下是Mac OS X的完整命令:
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-web-security

在执行此操作之前,请记得关闭所有Chrome进程,否则它将无法正常工作。 - Ferruccio

4
我们在开发Web应用程序时也有同样的需求。以下是我们的解决方案:
浏览器和服务器之间只通过JSON进行通信。
所有HTML都使用我们的JS模板引擎PURE在浏览器中呈现。
浏览器代码是本地开发的,方法如下:
我们在应用程序的URL中添加一个host参数:
http://localhost/app.html?host=test.beebole-apps.com

在生产环境中,使用POST将JSON发送到服务器。
但是,在这里负责ajax调用的函数将会对host参数作出反应,并进行JSONP注入(GET)

<script src="http://test.beebole-apps.com/?callback=f2309892&json={...}" />
  • f2309892是一个临时函数,随机命名,指向处理响应的方法
  • json是我们发送到服务器的JSON

这意味着您需要从后端获得一些合作,以便将包装在回调函数中的JSON提供给您,例如:

f2309892( /*the json here*/ );

除了大小限制(使用GET方法无法发送大型JSON到服务器),它的工作就像微风一样。
另一个优点是您可以从同一本地主机调用所有不同的系统(开发和测试)。


太好了!我注意到你在http://beebole.com/pure/documentation/what-is-pure-and-why/中没有使用PURE的本地化...另外,你能否稍微扩展一下你的话,在http://beebole.com/pure/documentation/中编写一个教程? - ina
为了确保,也就是说,http://localhost/app.html?host=test.beebole-apps.com 在客户端上(您在其中下载一个带有某种Web服务器或URL解析器的应用程序...)并调用 test.beebole-apps.com 服务器? - ina
PURE是一个JS库,可以从JSON数据构建HTML。它适用于浏览器。如果您下载zip文件,其中有一个名为tutorial的目录,其中包含一些示例。 - Mic
如果您有本地Web服务器进行开发,可以使用http://localhost/app.html;如果没有,则可以使用类似file:///Users/mic/app.html或C:\test\app.html的东西;然后在该页面中注入带有test.beebole-apps.com的脚本标记。 - Mic

2

有不同的方法来解决这个问题,具体取决于您用于开发的浏览器。例如:

  • 在 Firefox(Gecko)中,将 security.fileuri.strict_origin_policy 设置为 false
  • 在 Chrome 中,使用选项 --allow-file-access-from-files 启动浏览器

参考资料:FirefoxChrome


1

值得一提的是,在安装后,您必须点击“查看= >工具栏= >插件栏”。然后,CORS按钮将显示在右下角,请单击以启用它。我解压了XPI文件并看到一个切换函数,但从未看到按钮。 - HMR

0

我也遇到了这个问题,使用Chrome浏览器并添加--allow-file-access-from-files选项并没有真正帮助解决问题。回到我的服务器需要返回的脚本上,我在响应中添加了这些头信息,然后它就可以正常工作了:

'Access-Control-Allow-Origin: http://localhost/'

还有一个用于允许一种密钥交换的函数

'Access-Control-Allow-Headers: X-KEY'

0


0

由于这是一个开发问题而不是终端用户/功能问题,因此与其专注于使AJAX跨域,不如把你的开发环境设置为代理以从生产服务器获取最新数据。这实际上非常容易做到。

你需要在开发环境中设置一个Web服务器(如果还没有的话),然后将服务器配置为响应404请求并获取、回显生产数据。你可以设置你的服务器只拾取AJAX数据文件(否则,如果生产资产开始出现在你的开发页面上,调试其他文件会很混乱)。所以如果http://dev.myserver.com/data/json/mydata.json不存在,你的404脚本将获取http://prod.myserver.com/data/json/mydata.json并将其回显给客户端。这个设置的好处是你可以轻松使用模拟数据:如果该文件在你的开发环境中存在,你的AJAX脚本将获取该文件,但是如果你删除或重命名该文件,你将得到生产数据。这个功能非常有用,我强烈推荐它。

如果您正在使用XML,我建议在404中复制HTTP头。如果您的404处理响应的Content-Type是text/html,则无法获取任何responseXML进行解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接