JSONP和XMLHttpRequest问题

3
我正在尝试理解浏览器中的同源策略(同时也是JavaScript新手),在维基百科上遇到了JSONP页面。它是如何工作的部分说:

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

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

我的问题是 -

  • XMLHTTPRequest()是否只返回javascript或html?它不能返回纯json文档吗?
  • 我认为同源策略不适用于XMLHttpRequest()调用。为什么需要将一个标签注入DOM以调用第三方服务器?这是所有广告插件用来收集数据的方式吗?
  • 最终,我完全不理解JSONP。有人能解释一下或者给我推荐一个更好的解释吗?

谢谢,

- P

1个回答

8
XMLHTTPRequest()只返回javascript或html吗?
它可以返回任何您喜欢的文本(也许包括二进制数据,但我从未尝试过,所以不确定)。
它不能只返回纯json文档吗?
可以的。
我认为同源策略不适用于XMLHttpRequest()调用。
同源策略绝对适用于XHR。
为什么需要将标签注入DOM以调用第三方服务器?
通过从另一个来源加载带有嵌入数据的脚本来绕过同源策略。
这是因为您不是使用JavaScript读取远程资源。您正在执行一些带有嵌入数据的远程JavaScript。
最后,我完全不理解JSONP。有人能解释一下或者给我一个更好的解释吗?
JSON-P只是从另一个来源加载一些JavaScript。该JavaScript由一个函数调用组成(在添加

1
很好的回答。我想补充/澄清一下,JSONP脚本源之所以特殊,是因为它包含一个回调函数,因此它可以调用/影响您自己的脚本。 - Matt
谢谢你的回答!我现在也理解了文章中对XSS的引用。 - user220201

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接