【问题标题】:JSONP - Explain the pitfalls of jQuery.ajax() static "jsonpCallback" ( vs jQuery random callback names )JSONP - 解释 jQuery.ajax() 静态“jsonpCallback”的缺陷(对比 jQuery 随机回调名称)
【发布时间】:2011-08-27 09:19:02
【问题描述】:

我在静态文件服务器 - GitHub Pages 上提供我的 JSONP JavaScript 文件。

这意味着我无法动态地在服务器上设置 JSONP 回调函数名称...

Dynamic example - PHP

header('Content-Type: text/javascript; charset=utf8');
$data = '{ "foo":"bar" }'; // json string
echo $_GET['callback'] .'('.$data.');'; // function name set via ?callback=xyz

jQuery.ajax() 有一个jsonpCallback 参数来定义一个静态回调函数名称。所以我可以提供一个 javascript 文件,例如test-jsonp.js 内容如下:

静态示例 - JavaScript 文件

jsonpCallbackABC({ "foo":"bar" });

然而 jQuery 文档表明 static 不太理想。

http://api.jquery.com/jQuery.ajax/

jsonpCallback
指定回调函数名称 JSONP 请求。这个值将是 使用而不是随机名称 由 jQuery 自动生成。它 最好让 jQuery 生成一个 唯一的名称,因为它会更容易 管理请求并提供 回调和错误处理。你可以 想要指定回调时 想要启用更好的浏览器缓存 GET 请求数。

有人可以详细介绍一下静态 JSONP 函数名称的缺陷吗?

【问题讨论】:

  • 具体来说,我希望有人对任何安全问题发表评论。

标签: jquery static github jsonp


【解决方案1】:

这很简单:您的页面是否使用 jsonp 进行同时请求(大多数页面都是这样做的,因为请求是从页面事件异步启动的)?

如果是这样,如果您有单入口点(单 jsonp 回调),则响应将更难分离和处理。

我在最近的一个项目中使用了静态回调函数名称,但它是在同步模式下使用的,并且在页面生命周期内仅使用一次,因此将回调名称设为静态没有问题。

【讨论】:

  • 我想知道在处理静态函数名称时 $.getScript() 是否可能是一个“更好”的选择......考虑返回一个命名空间的 var,而不是尝试调用一个函数 @987654321 @你怎么看?
  • +1 天哪,我调试了一段时间才偶然发现这个问题。现在看来太明显了!如果您在单个页面上有多个 jsonp ajax 请求,则需要多个回调函数,而不是所有 ajax 请求共享一个回调函数。这尤其成问题,因为我的一个请求被缓存了,而另一个没有。 @Monoman,感谢您的帮助!
【解决方案2】:

如果你的代码中的其他地方定义了同名的函数,它将与 jsonp 中的函数发生冲突。

如果您尝试在页面的不同部分调用相同的服务,也可能会遇到问题,所有 ajax 调用都会收到相同的响应,这可能会导致难以调试行为。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2013-05-10
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2011-03-24
    • 2010-12-09
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多