回调是您在自己的代码中定义的函数。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(...)。如果远程站点知道您的代码的结构,它就可以使用该代码执行任意操作,因为您已经敞开了大门,允许该站点做任何想做的事情。