是的,这违反了 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.