为啥这个 URL 不属于同源策略?

Posted

技术标签:

【中文标题】为啥这个 URL 不属于同源策略?【英文标题】:why this URL is not coming under same origin policy?为什么这个 URL 不属于同源策略? 【发布时间】:2012-07-01 18:21:02 【问题描述】:

我对 JSON-P 的了解(来自 JSON-P VS JSON 和 wikipedia)是 - 发明 JSON-P 是为了克服 same origin policy of browsers 并从另一个域加载 JSON 对象。 *** 上有一个post,它显示了 JSON-P 调用的工作原理。看起来,如果我从 URL 中删除 ?callback=?,JSON-P 请求就像普通的 JSON 调用一样,因此被同源策略拒绝。由this live example 证明。

现在我有另一个网址:https://graph.facebook.com/100001612121705.json 我使用以下方法从中加载数据(visit here for live example):

$(document).ready(function() 
    $.getJSON("https://graph.facebook.com/100001612121705", null,
    function(data) 
        $.each(data, function(key, val)  
            alert(key + ' is ' + val);
        );
    );
);​

请注意,我没有在我的 URL 中使用 ?callback?,但这个请求仍然能够从另一个域获取 JSON 数据!这对我来说非常令人惊讶。谁能解释一下为什么这个请求没有被同源规则拒绝?

【问题讨论】:

你指的jsFiddle使用的是:"?callback=?" 【参考方案1】:

这是因为 HTTP-response 包含此标头:

Access-Control-Allow-Origin: *

* 表示任何来源都可以通过 XHR (Ajax) 检索给定资源。

因此,如果您的网络服务器上有资源,并且希望通过 XHR 使其可用而不管来源,只需将上述标头添加到 HTTP 响应。

【讨论】:

感谢 Šime Vidas 和 @BobDavies 为我解惑。你们两个都已经得到了我的投票。我接受鲍勃的回答,因为他需要更多的声誉。谢谢大家:)【参考方案2】:

Facebook 的服务器发出

的标头
Access-Control-Allow-Origin: *

此标头在调用的第一阶段由浏览器检索并解析,它表明任何引荐来源(原始页面)都可以从该 url 加载数据。从而绕过同源策略限制。

这里的标准信息:

Cross-Origin Resource Sharing

【讨论】:

以上是关于为啥这个 URL 不属于同源策略?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot配置Cors跨域请求

当 JSONP 和 CORS 等变通方法存在时,为啥浏览器会有同源策略?

Python-Django浏览器同源策略

为啥以及如何在脚本标签中免除同源策略?

同源策略形象解读

django之同源策略