JavaScript可以与不同的服务器通信吗?
Can JavaScript communicate to a different server?
JavaScript 可以与位于不同服务器上的数据库进行交互吗?
即涉及三台计算机
- 服务器 :它为带有 JavaScript 的 HTML 页面提供
- 客户端 :运行要与之通信的页面
- 第二台服务器:向/从客户端发送和接收数据
这是否违反了同源政策?如果不是,为什么不呢?如果是这样,有没有办法解决它?
我的背景 - 我是一名称职的计算机科学家,但我从未处理过客户端编程。在回答时,请随意使用复杂的想法,但请假设我对JavaScript语言或客户端编程背后的特定策略一无所知。
每当 html 来自服务器 1 并且 AJAX 请求转到服务器 2 时,它都会违反同源。
查看跨源资源共享。这是一个旨在处理此问题的标准情况。它在大多数现代浏览器中实现。
或者,您可以使用 JSONP 提供数据,或者如果您无法控制第二台服务器,请使用反向代理通过第一台服务器将请求代理到第二台服务器。
是的,这违反了 SOP。有很多方法可以解决这个问题,但值得强调的一个关键点:
客户端访问远程服务器的任何尝试都需要该服务器的共谋。
那么有哪些选择呢?
JSON-P
JSON-P 涉及让服务器返回包装在对回调函数的调用中的响应。它的工作原理是这样的:
- 新的脚本标记以 DOM 脚本写入页面,或者现有脚本标记重用
- 脚本标记的
src
属性设置为请求路径(脚本标记可以从任何位置加载脚本 - 它们不受标准操作程序) - 服务器响应数据,通常(但不一定)编码作为 JSON,并将其打印出来作为调用回调函数(必须在 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 中。
有关此内容的更多信息,请点击此处。
科尔斯/XHR2
在 CORS(也就是 XHR(即 AJAX)v2 背后的跨域思想)中,这意味着服务器发送一个标头,表示哪些域可以向其发出跨域请求 - 或所有域。例如,在 PHP 中,我们可以允许任何调用方域发出请求,从而:
header("Access-Control-Allow-Origin: *");
有关此内容的更多信息,请点击此处。
易鑫达米*
EasyXDM整理了许多特定于供应商的和更新的HTML5到达方式,用于在域之间发布和接收基于文本的消息,值得一看。
非 JS
如果您需要从不玩游戏的服务器获取某些内容,您唯一的选择是中间服务器端脚本,因为这些脚本可以触发 cURL 请求,这些请求可以在没有 SOP 限制的情况下抓取远程资源。
$curl = curl_init("http://www.example.com/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
更多关于 cURL 的信息,请点击此处。
是的,这违反了同源策略。
您可以使用 JSONP 绕过此限制,它利用 script
标记的行为从第二个(数据库)主机获取数据。这假设您可以通过非常特殊的方式从第二个主机提供数据:在回调中包装 JSON 响应。它还需要使用 GET 来提供响应。
另一种方法是 CORS,它还需要对服务器发送数据的方式进行一些控制,并将限制您使用更新的 Web 浏览器。
- JavaScript可以与不同的服务器通信吗?
- 用于客户端-服务器通信和安全的 API 密钥
- 使用 node.js 进行客户端服务器通信
- 在 NodeJS 中进行客户端-服务器通信的简单方法
- 当本地主机服务器提供实际页面时,如何使用 socket.io 与另一台服务器通信
- PHP 聊天客户端-服务器通信
- 使用Backbone.js与服务器通信
- javascript和C#服务器通信
- 如何设置Websocket与客户端和服务器发送事件服务器通信
- 客户端JavaScript与c#服务器通信
- 提示客户端服务器通信的网站与负载的图像
- 是否可以或不写一个Chrome扩展与专用服务器通信
- 从浏览器与flash媒体服务器通信,而不是使用swf
- 打开多个选项卡,但只有一个选项卡与服务器通信
- 我如何允许节点pg模块与我的Windows postgresql服务器通信
- 主干网破坏无服务器通信
- 如何让Flash应用程序与服务器通信
- ajax客户端-服务器通信
- NodeJs 与 EC2 上的 ubuntu 服务器通信
- 套接字.IO客户端无法与服务器通信