为什么这个URL不在同源策略之下?
为什么这个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数据!这对我来说非常令人惊讶。有人可以解释一下为什么这个请求不会被同源规则拒绝吗?
同源策略是一种浏览器安全机制,用于限制不同源之间的数据交互。同源策略要求,两个页面只有在协议、域名和端口号完全相同的情况下,才可以进行数据交互。然而,有时候我们希望允许不同源之间的数据交互,这时就需要跨域资源共享(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的数据。