9

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

4

8 回答 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 将 AJAX 调用发送到在端口 8080 上运行的 Google Apps python 服务器。只是为了测试,我想在同一台机器上运行浏览器和服务器。

我不了解所有的安全细微差别,但对于临时开发来说,这似乎是一个合理的解决方法。只要我只使用 chrome 来测试这个标志,它应该不是问题。

这是 Mac OS X 的完整命令:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-web-security

于 2011-03-12T06:44:40.337 回答
4

我们在开发 Web 应用程序时也有同样的需求。我们是这样做的:

浏览器和服务器仅通过 JSON 进行通信。所有的 HTML 都使用PURE(我们的 JS 模板引擎)
在浏览器中呈现。 浏览器代码在本地开发是这样的:

host我们在app的url中添加一个参数:

http://localhost/app.html?host=test.beebole-apps.com

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

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

这意味着您将需要后端的一些合作来为您提供包装在回调函数中的 json,例如:

f2309892( /*the json here*/ );

除了大小限制(您不能使用 GET 将大 JSON 发送到服务器),它的工作就像轻而易举。
另一个优点是您可以从同一个本地主机调用所有不同的系统(开发和测试)。

于 2010-08-14T16:59:30.973 回答
2

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

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

参考:火狐Chrome

于 2010-08-14T04:29:11.577 回答
1

无需接触服务器 -

在 Firefox 中绕过同源安全策略的最快和最简单的方法是安装 Force CORS 插件。通过在每个响应中插入正确的标头,这适用于任何服务。

https://addons.mozilla.org/en-US/firefox/addon/forcecors/

于 2012-02-09T21:33:59.613 回答
0

localhost 不允许在 CORS 中使用http://code.google.com/p/chromium/issues/detail?id=67743请改用 lvh.me

于 2013-04-18T13:41:33.933 回答
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-Typeof响应text/html,您将无法responseXML解析任何内容。

于 2010-08-14T04:33:22.017 回答
0

我也有这个问题,使用 Chrome 并且该--allow-file-access-from-files选项并没有真正帮助。回到我的服务器需要返回的脚本,我将这些标头添加到响应中,它运行良好:

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

另一个用于允许一种密钥交换

'Access-Control-Allow-Headers: X-KEY'
于 2012-02-04T17:34:14.920 回答