【问题标题】:Cross Domain Ajax Request with JQuery/PHP使用 JQuery/PHP 的跨域 Ajax 请求
【发布时间】:2010-10-19 15:13:55
【问题描述】:

帮助,如果可以的话-

情况:

http://foobar.com 包括一个远程托管的 javacript 文件 (http://boobar.com/stuff.js)。

目标是从 foobar.com 上远程托管的 php 脚本中获取警报

我在 stuff.js 中尝试了以下代码:

$.ajax({
  type: "GET",
  url: "http://www.boobar.com/script.php?callback=?",
  dataType: 'jsonp',
  success: function(result) { alert(result); }
});

运气不好。

$.getJSON("http://www.boobar.com/script.php?jsonp=?",
  function(data) { alert(data); }
);

也没有运气。

在 php 方面,我尝试了以下两种方法:

return json_encode(array(0 => 'test'));

echo json_encode(array(0 => 'test'));

在 Firefox 中,我收到一个安全错误。我了解它认为我违反了安全模型。但是,根据 jquery 文档,我应该能够做到这一点。

【问题讨论】:

  • 所以我最终做了什么,因为它只是一个 GET - 不需要检索数据 - 我使用 JQuery 创建了一个隐藏的 iframe,其 URL 包括我想要传递的变量设置为资源。像魅力一样工作。感谢所有提供反馈的人 - 谢谢!

标签: php javascript jquery ajax


【解决方案1】:

有一种称为window.name transportwindow.name method 的方法使用一般浏览器错误(不确定这是否真的是错误)。您通过 iFrame 发出请求,加载的页面将您需要的信息放入自身的 JavaScript 窗口对象的“名称”属性中。

此方法使用“blank.htm”,因为它首先导航到目标页面,然后返回到 blank.htm 页面以克服“同源策略”限制。

Dojo 已经实现了这个,你可以找到更详细的解释here

我还在我编写的库中实现了一个基于此方法的跨域 XMLHttpRequest 对象,可以在 here 找到。

您可能无法使用该库,因为它需要 1 或 2 个额外的库,可以在 here 找到。

如果您在以您的风格实现它时需要进一步的帮助,我会尽力做到最好。

【讨论】:

    【解决方案2】:

    jQuery .ajax 还有一个设置'crossDomain'。

    http://api.jquery.com/jQuery.ajax/

    crossDomain(默认:同域请求为 false,跨域请求为 true) 类型:布尔值 如果您希望在同一域上强制执行跨域请求(例如 JSONP),请将 crossDomain 的值设置为 true。例如,这允许服务器端重定向到另一个域。 (添加的版本:1.5)

    【讨论】:

      【解决方案3】:

      这个怎么样!!使用 php 代理。

      使用 PHP 的跨域 AJAX 调用 http://www.phpfour.com/blog/2008/03/cross-domain-ajax-using-php/

      【讨论】:

        【解决方案4】:

        所以我最终做了什么,因为它只是一个 GET - 不需要检索数据 - 我使用 JQuery 创建了一个隐藏的 iframe,其 URL 包括我想要传递的变量集作为源。像魅力一样工作。感谢所有提供反馈的人 - 谢谢!

        【讨论】:

        • 怎么样?请提供详细信息。谢谢。
        • 其实我明白了。感谢 iframe 的想法。
        【解决方案5】:

        您可以使用脚本标签和 json 从另一个服务器异步获取数据:

        <script type="text/javascript" src="http://somesite.com/path/to/page/"></script>
        

        您可以使用它来动态加载远程 javascript(通过创建一个新的脚本元素并设置 src 属性,然后加载到 DOM 中),这可以设置一个变量。但是,您需要真正信任远程站点,因为 JS 将被评估没有任何先决条件

        【讨论】:

          【解决方案6】:

          该错误似乎是Same Origin Policy 的一项安全功能:为简化起见,您只能对原始服务器 (http://foobar.com) 上的内容发出 AJAX 请求。解决此问题的一种方法是在原始服务器上制作一个简单的外观,例如:

           <?php
           // this file resides at http://foobar.com/getstuff.php
           echo file_get_contents('http://www.boobar.com/script.php?callback=?'
                    . $possibly_some_other_GET_parameters );
           ?>
          

          然后,从 foobar.com,您可以向 http://foobar.com/getstuff.php 发出 AJAX 请求(这反过来又从您的 Web 服务器发出 HTTP GET 请求 到 boobar.com 并将其发送回浏览器)。

          对于浏览器,请求会发送到源服务器,并被允许(浏览器无法知道响应来自幕后的其他地方)。

          注意事项:

          • foobar.com 上的 PHP 配置必须将 allow_url_fopen 设置为“1”。虽然这是默认设置,但某些服务器已禁用它。
          • 对 www.boobar.com 的请求来自 foobar.com 服务器,而不是来自浏览器。这意味着不会将任何 cookie 或用户身份验证数据发送到 www.boobar.com,无论您在请求 URL 中输入什么(“$possibly_some_other_GET_parameters”)。

          【讨论】:

          • 对于最后一步,cookie 和身份验证,我猜也许可以用 cURL 完成
          • 我也会使用 cURL,但我以 file_get_contents 为例。
          猜你喜欢
          • 1970-01-01
          • 2011-07-05
          • 1970-01-01
          • 2013-06-15
          • 1970-01-01
          • 2012-07-29
          • 2016-10-02
          • 2011-12-24
          相关资源
          最近更新 更多