【问题标题】:Is there a way to bypass Javascript / jQuery's same origin policy for local access?有没有办法绕过 Javascript / jQuery 的本地访问同源策略?
【发布时间】:2011-03-29 18:14:51
【问题描述】:

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

【问题讨论】:

    标签: javascript jquery same-origin-policy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        无需接触服务器 -

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

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

        【讨论】:

        • 值得一提的是,安装后您必须点击查看 => 工具栏 => 附加栏。然后 cors 按钮将显示在右下角单击以启用它。我解压了 xpi,看到按下按钮时有一个切换功能,但从来没有看到按钮。
        【解决方案4】:

        这是简单的答案: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

        【讨论】:

        • 记得在执行此操作之前杀死 chrome 进程的所有实例,否则它将不起作用。
        【解决方案5】:

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

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

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

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

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

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

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

        f2309892( /*the json here*/ );
        

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

        【讨论】:

        • 这太棒了!我注意到您在 beebole.com/pure/documentation/what-is-pure-and-why 中没有 PURE 的这种本地使用......另外 - 您可以稍微扩展一下您的文字以在 beebole.com/pure/documentation 中编写教程吗?
        • 也(只是为了确定)-http://localhost/app.html?host=test.beebole-apps.com 在客户端(您让客户端下载一个带有某种 Web 服务器或 URL 解析器的应用程序......),它调用test.beebole-apps.com 服务器?
        • PURE 是一个从 JSON 数据构建 HTML 的 JS 库。它适用于浏览器。如果您下载 zip 文件,则会有一个名为 tutorial 的目录,其中包含一些示例。
        • 如果本地有web服务器开发,可以使用localhost/app.html;如果没有,您可以使用类似 file:///Users/mic/app.html 或 C:\test\app.html;然后在该页面中注入带有 test.beebole-apps.com 的脚本标签
        【解决方案6】:
        【解决方案7】:

        由于这是一个开发问题,而不是最终用户/功能问题,因此与其专注于让 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-Typetext/html 响应,您将无法解析任何 responseXML

        【讨论】:

          【解决方案8】:

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

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

          参考:FirefoxChrome

          【讨论】:

            猜你喜欢
            • 2014-12-17
            • 2018-01-23
            • 2015-09-05
            • 2015-07-21
            • 2019-01-21
            • 2014-03-17
            • 2012-12-30
            • 2011-01-05
            • 2011-02-14
            相关资源
            最近更新 更多