为什么这个URL不在同源策略之下?

10 浏览
0 Comments

为什么这个URL不在同源策略之下?

我从JSON-P VS JSON维基百科上学到的关于JSON-P的知识是- JSON-P是为了克服浏览器的同源策略而发明的,它可以从另一个域加载JSON对象。在stackoverflow上有一个帖子展示了JSON-P调用的工作原理。在那个帖子中,如果我从URL中移除?callback=?,JSON-P请求就会像普通的JSON调用一样,因此被同源策略拒绝。这在这个实例中得到了证明。\n现在我有另一个URL:https://graph.facebook.com/100001612121705.json\n我使用以下方法从中加载数据(点击此处查看实例):\n

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

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

0
0 Comments

同源策略是一种浏览器安全机制,用于限制不同源之间的数据交互。同源策略要求,两个页面只有在协议、域名和端口号完全相同的情况下,才可以进行数据交互。然而,有时候我们希望允许不同源之间的数据交互,这时就需要跨域资源共享(CORS)机制的支持。

在Facebook的服务器中,它发出了以下的响应头:

Access-Control-Allow-Origin: *

这个响应头会在浏览器的第一阶段被检索和解析,它表示任何引用者(源页面)都可以从该URL加载数据,从而绕过了同源策略的限制。

关于CORS标准的更多信息可以在这里找到:Cross-Origin Resource Sharing

因此,这个URL没有被同源策略所限制的原因是因为服务器发送了一个允许所有源的响应头。这样一来,任何引用该URL的页面都可以加载其数据。

要解决这个问题,可以在服务器端设置合适的响应头。通过设置允许访问的源,可以限制跨域访问的范围。例如,可以将响应头设置为:

Access-Control-Allow-Origin: http://www.example.com

这样只有来源于"http://www.example.com"的页面才能加载该URL的数据。

0
0 Comments

这个问题的出现的原因是因为HTTP响应包含了以下头部信息:

Access-Control-Allow-Origin: *

其中的*表示任何来源都可以通过XHR(Ajax)获取给定资源。

所以,如果你在你的web服务器上有一个资源,并且想让它无论来源如何都可以通过XHR获取,只需在HTTP响应中添加上述头部信息。

感谢Šime Vidas和对于解答我的疑惑。你们两个已经得到了我的支持。我选择接受Bob的答案,因为他需要更多的声誉。谢谢大家 🙂

0