回调是一个函数,你'VE在您自己的代码中定义。 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是绕过浏览器的同源脚本安全策略,由具有第三方服务器注入函数调用的方式直接进入你的页面。请注意,这在设计上非常不安全。您认为远程服务是光荣的,并没有恶意的意图。没有什么能够阻止一些糟糕的服务返回一些JS代码来窃取你的银行/脸书/任何凭据。例如...... JSONP响应可能是
internalUseOnlyFunction('deleteHarddrive');
而不是parseReponse(...)。如果远程站点知道你的代码的结构,它可以使用该代码执行任意操作,因为你已经打开了前门,允许该站点执行任何想要的操作。
可能重复[请解释JSONP](http://stackoverflow.com/questions/2067472/please-explain-jsonp) – Jon 2012-04-17 14:27:13