回调是您在自己的代码中定义的函数。jsonp 服务器将使用与您指定的回调函数名称相同的函数调用来包装其响应。
这是怎么回事:
1) 您的代码创建 JSONP 请求,这会产生一个<script>
如下所示的新块:
<script src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"></script>
2) 新脚本标签由您的浏览器执行,从而向 JSONP 服务器发出请求。它回应
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
3)由于这个请求来自一个脚本标签,它几乎和你真正放置的一样
<script>
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
</script>
进入您的页面。
4) 现在这个新脚本已经从远程服务器加载,它现在将被执行,它唯一会做的就是一个函数调用parseResponse()
,传递 JSON 数据作为函数调用的唯一参数。
因此,在您的代码中的其他地方,您将拥有:
function parseResponse(data) {
alert(data.Name); // outputs 'Foo'
}
基本上,JSONP 是一种绕过浏览器同源脚本安全策略的方法,通过让第 3 方服务器将函数调用直接注入您的页面。请注意,这是设计上非常不安全的。您依赖于远程服务是光荣的并且没有恶意。没有什么能阻止糟糕的服务返回一些窃取您的银行/facebook/任何凭据的 JS 代码。例如... JSONP 响应可能是
internalUseOnlyFunction('deleteHarddrive');
而不是 parseReponse(...)。如果远程站点知道您的代码结构,它就可以使用该代码执行任意操作,因为您已经敞开大门,允许该站点做任何它想做的事情。