【问题标题】:JSONP and XMLHttpRequest questionJSONP 和 XMLHttpRequest 问题
【发布时间】:2011-10-14 09:47:18
【问题描述】:

我试图了解浏览器(以及 Javascript 新手)中的同源策略并遇到了 wikipedia 上的 JSONP 页面。 How It Works 部分说 -

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

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

我的问题是 -

  • 那么 XMLHTTPRequest() 应该只返回 javascript 或 html 吗?不能返回纯json文档吗?
  • 我认为同源策略不适用于 XMLHttpRequest() 调用。为什么需要在 DOM 中注入标签来调用第三方服务器?网站的所有广告插件都是这样收集数据的吗?
  • 最后我根本不懂 JSONP。有人可以解释一下,或者请我参考更好的解释吗?

谢谢,

-p

【问题讨论】:

    标签: javascript xmlhttprequest jsonp


    【解决方案1】:

    那么 XMLHTTPRequest() 应该只返回 javascript 或 html 吗?

    它可以返回任何你喜欢的文本(也许是二进制数据,但我从未见过这样的尝试,所以我不会发誓)

    不能返回纯json文档吗?

    可以。

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

    同源政策绝对确实适用于 XHR

    为什么需要在 DOM 中注入标签来调用第三方服务器?

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

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

    最后我根本不懂 JSONP。有人可以解释一下或向我推荐一个更好的解释吗?

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

    【讨论】:

    • 很好的答案。我要补充/澄清一下,JSONP 脚本源的特别之处在于它包含一个回调函数,因此它可以调用/影响您自己的脚本。
    • 感谢您的回答!我现在也明白文章中提到的XSS了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2014-01-01
    • 2011-09-13
    • 2011-02-05
    • 2013-09-12
    相关资源
    最近更新 更多