另一个域的 javascript 文件发出的 AJAX 请求

Posted

技术标签:

【中文标题】另一个域的 javascript 文件发出的 AJAX 请求【英文标题】:AJAX requests made by another domain's javascript file 【发布时间】:2016-08-15 08:29:32 【问题描述】:

让两个 Visual Studio 运行在具有以下 URL 的同一台计算机上:

    http://localhost:47503(网络接口,#1)

    http://localhost:12345(调用以上web api的客户端,#2)

客户端 (#2) 硬编码站点 #1 的 <script src="http://localhost:47503/file.js"></script>。 file.js 内部是一个函数:

function GetData() 
$.ajax(
    url: 'http://localhost:47503/api/autos',
    type: 'GET',
    dataType: 'json',
    data:  "a": '_1', "b": 'TEST', "c": "val c" ,
    success: function (result) 
        alert("success");
    
);

跨域请求被阻止:同源策略不允许读取 远程资源在 http://localhost:47503/api/autos?a=_1&b=TEST&c=value+c。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。

认为由于脚本是从客户端 #1 加载的,因此可以从客户端 #2 调用它,从而以某种方式绕过相同的源策略?来自客户端 #1 的脚本回调客户端 #1。 JSONP 和 CORS 是已知的问题解决方案,但想知道上述是否可行。

【问题讨论】:

【参考方案1】:

认为由于脚本是从客户端 #1 加载的,因此可以从客户端 #2 调用它,从而以某种方式绕过相同的源策略?

不,这是不可能的。来源始终是文档的来源,而不是单个脚本标签。这就是您能够从 CDN 加载库(如 jQuery)的方式,但向您自己的服务器发出 AJAX 请求。


附带说明,即使来源是由进行调用的脚本确定的(它从来不是),您的代码仍然无法工作,因为它实际上是 jQuery 进行 AJAX 调用。

【讨论】:

问题的灵感来自 Google Adsense 的工作原理 (en.wikipedia.org/wiki/AdSense)。用户将 javascript 添加到他们的网站,然后远程调用 Google 的服务器以显示广告。知道如何模仿这种行为吗? @invulnarable27 使用 JSONP 很容易,我认为这是 Wikipedia 所描述的。 非常感谢,希望确保我涵盖了所有基础【参考方案2】:

跨域请求被阻止

您的服务器 #1 可以通过在其 HTTP 响应中添加标头“Access-Control-Allow-Origin”来明确告诉 Web 浏览器它实际上接受来自其他域的请求。

【讨论】:

那些 XML 文件仅适用于已弃用和过时的插件。除非使用 Flash (ugh) 或 Silverlight (eww, Gross),否则请跳过这些。 他可以使用表头

以上是关于另一个域的 javascript 文件发出的 AJAX 请求的主要内容,如果未能解决你的问题,请参考以下文章

我可以从另一个域的 iframe 父级访问 javascript

托管在不同域上的 JavaScript 可以读取/修改另一个域的 DOM 吗?

ajax

将子域重定向到另一个域的文件夹

JSONP跨域和CORS跨域的区别

跨域的简介与解决方案