【问题标题】:snap.com snapshots disobeys Same Orgin Policy?snap.com 快照违反了同源政策?
【发布时间】:2009-05-20 08:00:00
【问题描述】:
我正在尝试编写一些 Javascript,以根据对不同域上的服务器的 HTTP GET 请求显示数据。根据我的阅读,由于 SOP(同源政策),这变得很棘手。
我很好奇 snap.com “快照”(网页预览)的工作原理。这是一个示例页面:http://premshree.livejournal.com/66129.html
有人能解释一下这怎么可能吗?要启用 snap.com 的“快照”,您只需在标题中添加一些 Javascrpt。示例网页似乎违反了 SOP。
【问题讨论】:
标签:
javascript
ajax
cross-domain
【解决方案1】:
“快照”JavaScript 托管在 snap.com 上,因此它可以访问 snap.com 的所有内容,即页面预览,因为它实际上遵守同源政策。但是,它无法调用 livejournal.com 上的任何页面。
希望这会有所帮助。
【解决方案2】:
按照 Ian 的回答,您可以让 AJAX 使用 JSONP 跨越 SOP 提出的域障碍。什么是 JSONP?它是我们都知道和喜爱的同一个 JSON 对象,但它被一个函数包裹:
JSON:
{
prop1: "a",
prop2: 7
}
JSONP:
myfunction(
{
prop1: "a",
prop2: 7
});
如您所见,JSON 对象作为参数传递给myfunction 函数。因此,如果您要使用简单的 script 标记链接到托管在不同域上的脚本资源,并且该资源返回 JSONP 数据,那么您可以简单地定义一个函数 myfunction,它接受一个 JSON 对象,然后执行有什么东西。 JQuery 支持使用getJSON 方法的JSONP Ajax 调用。 jQuery 插入一个 script 标记,而不是进行 AJAX 调用,该标记指向您尝试从中获取数据的 URL。当脚本加载时,你的回调函数就会被执行,瞧! - 你有 JSON 数据!这种技术有 3 个先决条件。
- 您尝试从中请求数据的服务返回 JSON(默认情况下或使用参数请求时)。
- 服务支持 JSONP,允许您指定用于包装 JSON 数据的回调函数。
- 您对这个外部资源的信任足以让他们的代码在您的站点上执行。