JavaScript可以与位于不同服务器上的数据库进行交互吗?
即。涉及三台计算机
这会违反Same Origin Policy吗?如果不是为什么不呢?如果是这样的话还有办法吗?
我的背景 - 我是一位称职的计算机科学家,但我从未处理过客户端编程。虽然回答时可以随意使用复杂的想法,但请假设我对JavaScript语言或客户端编程背后的具体策略一无所知。
答案 0 :(得分:3)
只要你的html来自服务器1并且AJAX请求转到服务器2,它就会违反同源。
结帐Cross Origin Resource Sharing。它是一个旨在处理这个问题的标准 情况。它在大多数现代浏览器中实现。
或者,您可以使用JSONP来提供数据,或者如果您无法控制第二台服务器,请使用反向代理通过第一台服务器将请求代理到第二台服务器。
答案 1 :(得分:3)
是的,这违反了SOP。有一些方法,但值得强调一个关键点:
客户端访问远程服务器的任何尝试都需要该服务器的共谋。
那么有什么选择?
<强> JSON-P 强>
JSON-P涉及让服务器将调用中包含的响应返回给回调函数。它的工作原理如下:
src
属性设置为请求路径(脚本标记可以从任何地方加载脚本 - 它们不受
SOP)因此,用本机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
将此信息附加到请求网址。
有关此here的更多信息。
CORS / XHR2
在CORS中,也就是XHR(即AJAX)v2背后的跨域理念,这意味着服务器发送一个标题,表示哪些域可以向其发出跨域请求 - 或者所有域。例如,在PHP中,我们可以允许任何调用者域发出请求:
header("Access-Control-Allow-Origin: *");
有关此here的更多信息。
<强> EasyXDM * 强>
EasyXDM整理了许多特定于供应商和更新的,HTML5到达的在域之间发布和接收基于文本的消息的方式,值得一看。
<强>非JS 强>
如果您需要从不玩球的服务器获取内容,您唯一的选择是中间服务器端脚本,因为它们可以触发可以在没有SOP限制的情况下刮取远程资源的cURL请求。
$curl = curl_init("http://www.example.com/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);
有关cURL的更多信息here。
答案 2 :(得分:1)