【问题标题】:How is this JSONP without a callback working?这个没有回调的 JSONP 如何工作?
【发布时间】:2019-04-16 20:45:59
【问题描述】:

我正在使用客户端 SDK,它在后台创建一个脚本并将其附加到 <head>,如下所示:

<script src="http://foo.com?foo=bar"></script>

注意没有callback 参数。

响应发回以下内容(带有标头Content-Type: application/javascript):

{ document.cookie="something=thing" }

它会在浏览器中设置 cookie(当我在开发工具中查看 cookie 时可以看到)。

奇怪的是,在脚本的 URL 中,没有回调参数,正如您通常在 JSONP 请求中所期望的那样。

我尝试通过向本地网页添加一个类似的脚本来复制此行为,并访问返回相同响应的本地服务器,但它没有设置 cookie,这与 SDK 不同。 SDK 本身非常简单,我没有看到任何其他魔法发生。

以前有人见过这样的事情吗?它是如何工作的?

编辑:这是内部 SDK 方法和示例响应

    _jsonp: function(o, e) {
        var t = document.createElement("script");
        t.type = "text/javascript", t.src = e, t.async = !0, document.getElementsByTagName("head")[0].appendChild(t), o.log("SENT JSONP request: " + e)
    },

示例响应:

响应标头

Connection: keep-alive
Content-Encoding: gzip
Content-Length: 158
Content-Type: application/javascript

响应正文

{document.cookie=<redacted>}

【问题讨论】:

  • 这不是真正的 jsonp 请求。它实际上只是一个 javascript 文件。
  • @KevinB 是的,我想我只是想知道该响应是如何执行的。此外,他们在后台将其称为 _jsonp 方法,所以我认为他们的意图是发出 jsonp 请求。
  • 这不是 jsonp 请求,因为该请求没有返回 JSONP。它正在返回 javascript。 jsonp 响应也是 javascript,但并非所有 javascript 都是 jsonp。
  • @KevinB 好吧,让我们假设他们的方法名称 jsonp 只是用词不当。我们还没有回答有关如何执行响应的问题。 FWIW,这是整个缩小的 SDK,如果你有 chrome 或其他的美化工具,可以阅读它:assets.jetlore.com/js/jltracking.js
  • 这段代码所做的只是设置一个cookie。当你包含它时,它会设置一个 cookie。就是……就是这样。 {document.cookie=<redacted>} 不是对象,它只是普通的旧 javascript。很可能只是alert('Hello World!'),然后会弹出一个警报。

标签: javascript jsonp


【解决方案1】:

尽管 API 源代码中有方法名称,但它不是 JSONP。

JSONP 是一个 JavaScript 程序,它符合以下特定格式: 仅包含一个函数调用,带有一个参数,如果从 JavaScript 程序中取出并放入 JSON 文件,则为 JSON。

JSONP 通过注入 <script> 元素来工作,该元素加载并执行 JavaScript 程序。

你这里有一个不符合 JSONP 格式的 JavaScript 程序。

它仍然是一个 JavaScript 程序。

使用<script> 加载仍然有效。

【讨论】:

  • 谢谢。 FWIW,我没有意识到 { document.cookie="something=thing" } 是有效的 JavaScript,但是当我在浏览器控制台中运行它时,它可以工作。时限到期时将接受答案
  • 赋值表达式周围的块完全没有意义。
猜你喜欢
  • 2012-06-25
  • 2013-07-02
  • 2012-02-13
  • 1970-01-01
  • 2017-09-28
  • 2013-04-25
  • 1970-01-01
  • 2019-12-12
  • 1970-01-01
相关资源
最近更新 更多