【问题标题】:Can JavaScript communicate to a different server?JavaScript 可以与不同的服务器通信吗?
【发布时间】:2012-07-04 23:42:22
【问题描述】:

JavaScript 可以与位于不同服务器上的数据库交互吗?

即涉及三台计算机

  • 服务器:提供带有 JavaScript 的 HTML 页面
  • 客户端:运行想要与之交谈的页面
  • 第二个服务器:向/从客户端发送和接收数据

这是否违反Same Origin Policy?如果不是为什么不呢?如果有,有办法解决吗?

我的背景 - 我是一位称职的计算机科学家,但我从未处理过客户端编程。虽然回答时可以随意使用复杂的想法,但请假设我对 JavaScript 语言或客户端编程背后的特定政策一无所知。

【问题讨论】:

  • 是的,可以。以$.getJSON jquery 实现为例:github.com/jquery/jquery/blob/master/src/ajax.js#L284
  • @MRocklin 这是一个标准评论,任何低于 60-70% 的人都接受,这表明你应该回去接受那些有帮助的答案,因为人们将来更有可能帮助你。跨度>
  • @MRocklin 这与问题无关。这是关于他如何不试图回答您的问题的评论。

标签: javascript ajax client-server client-side


【解决方案1】:

当您的 html 来自服务器 1 并且 AJAX 请求转到服务器 2 时,它确实违反了同源。

查看Cross Origin Resource Sharing。这是一个旨在准确处理此问题的标准 情况。它在大多数现代浏览器中实现。

或者,您可以使用JSONP 来提供数据,或者如果您无法控制第二台服务器,则使用反向代理将请求通过第一台服务器代理到第二台服务器。

【讨论】:

    【解决方案2】:

    是的,这违反了 SOP。有一些方法可以解决它,但值得强调一个关键点:

    客户端访问远程服务器的任何尝试都需要该服务器的参与。

    那么有哪些选择呢?

    JSON-P

    JSON-P 涉及让服务器返回包含在对回调函数的调用中的响应。它的工作原理是这样的:

    • 一个新的脚本标签被 DOM 脚本化到页面中,或者一个现有的标签是 重复使用
    • 脚本标签的src属性设置为请求路径(脚本标签可以从任何地方加载脚本——它们不受 SOP)
    • 带有数据的服务器响应,通常(但不一定)编码 作为 JSON,并将其打印为调用 a 的参数 回调函数(必须在你的 JS 中定义)

    所以用原生 JS 编写的 JSON-P 请求如下所示:

    callback = function(response) { console.log(response); };
    var script = document.createElement('script');
    script.src = 'http://www.some-request.com/here.php?callback=callback'; //the example happens to use the same name; the callback parameter tells the some-request domain what function to wrap JSON in 
    document.body.appendChild(script);
    

    那么,如果服务器的响应是

    callback({"foo": "bar"});
    

    ...我们会在控制台中得到响应。请注意,我明确地将函数设为全局,因为它必须是可访问的并且不能被范围隐藏。 (在这个意义上,它必须是全局可访问的,但不一定是传统意义上的全局 - 例如,它可以是全局命名空间的静态方法)。

    许多符合 JSON-P 的 Web 服务器允许您指定您希望它调用的函数的名称,通常是通过 &callback=func_name 将此信息附加到请求 URL。

    有关此here 的更多信息。

    CORS / XHR2

    在 CORS 中,也就是 XHR(即 AJAX)v2 背后的跨域思想,这意味着服务器会发送一个标头,表明哪些域可以向它或所有域发出跨域请求。例如,在 PHP 中,我们可以允许任何调用者域发出请求:

    header("Access-Control-Allow-Origin: *");
    

    有关此here 的更多信息。

    EasyXDM*

    EasyXDM 整理了许多特定于供应商和更新的 HTML5 到达方式,用于在域之间发布和接收基于文本的消息,值得一看。

    非 JS

    如果您需要从不玩球的服务器获取某些东西,您唯一的选择是中间服务器端脚本,因为这些可以触发 cURL 请求,可以在不受 SOP 限制的情况下抓取远程资源。

    $curl = curl_init("http://www.example.com/");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    

    更多关于 cURL here.

    【讨论】:

      【解决方案3】:

      是的,这违反了同源政策。

      您可以使用JSONP 绕过此限制,它利用script 标记的行为从第二个(数据库)主机获取数据。这假设您可以以非常特殊的方式从第二个主机提供数据:将 JSON 响应包装在回调中。它还需要使用 GET 来提供响应。

      另一种选择是CORS,它还需要对服务器发送数据的方式进行一些控制,并将限制您使用更新的网络浏览器。

      【讨论】:

        猜你喜欢
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 2019-11-25
        • 2013-12-30
        相关资源
        最近更新 更多