2011-07-27 63 views
3

我试图了解浏览器(也是Javascript新手)中的同一个源策略,并且跑到了wikipedia上的JSONP页面。 How It Works部分说 -JSONP和XMLHttpRequest问题

现在,考虑可以指定任何URL,包括返回JSON的URL作为元素的src>属性。这意味着可以通过> HTML页面中的脚本元素来检索JSON。

但是,JSON文档不是JavaScript程序。如果要由浏览器在元素中进行评估,则src URL的返回值必须是可执行的JavaScript。在JSONP使用模式中,URL返回动态生成的JSON,并在其中包含函数调用。这是JSONP的“填充”(或有时是“前缀”)。

我的问题是 -

  • 所以是的XMLHTTPRequest()应该返回只有JavaScript或HTML?它可以不返回纯json文件吗?
  • 我认为相同的源策略不适用于XMLHttpRequest()调用。为什么需要在DOM中注入标签以拨打第三方服务器?那么网站上的所有广告插件是如何呼叫家庭收集数据的?
  • 最后,我完全不理解JSONP。有人可以解释一下吗,或者请我介绍一下更好的解释?

感谢,

- P

回答

7

所以是的XMLHTTPRequest()应该返回只有JavaScript或HTML?

它可以返回任何你喜欢的文字(也许二进制数据,但我从来没有看到试过,所以我不会发誓的话)

能不回一个纯粹的JSON文件?

它可以。

我认为相同的源策略不适用于XMLHttpRequest()调用。

同源策略最肯定适用于XHR

为什么有需要注入标记到DOM做出第三方服务器的呼叫?

通过从另一个来源加载脚本(带有嵌入数据)可以绕过相同的原点策略。

这是因为您没有使用JavaScript阅读远程资源。您正在执行一些附带嵌入数据的远程JavaScript。

在它的最后我完全不理解JSONP。有人可以解释一下吗,或者请我介绍一下更好的解释?

JSON-P只是从另一个来源加载一些JavaScript。该JavaScript包含一个函数调用(对于您在添加<script>元素之前定义的函数)以及一个参数(JS对象或数组文本)。

+1

很好的答案。我会补充/澄清什么使JSONP脚本源特别是它包含一个回调函数,因此它可以调用/影响您自己的脚本。 – Matt

+0

感谢您的回答!我也理解现在这篇文章中提到的XSS。 – user220201