一、原理
就是利用 <script> 标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的。当需要通讯时,本站脚本生成一个回调方法,并创建一个 <script> 元素,地址指向第三方的API网址,参数上带上回调方法名。
形如:
<script>
//jsonp回调方法
function testjson(txt){
alert(txt);
}
</script>
<script src ="http://localhost/api?callback=testjson" type="text/javascript" ></script>
第三方服务器端产生的响应为json数据的包装(故称之为jsonp,即json padding),形如:
@GetMapping("/api")
@ResponseBody
public String testJsonp(String callback){
// 返回接收到的 回调函数名(json格式的数据)
return callback + "('{"name":"hax","gender":"Male"}');";
}
这样浏览器会调用callback函数,并传递解析后json对象作为参数。本站脚本可在callback函数里处理所传入的数据。
** 根据jsonp的工作原理,显而易见,它只能解决 GET 的跨域请求,而且也只是利用设计 “漏洞” 实现的跨域方式,现如今 CORS (跨域资源共享 Cross-Origin-Resource-Sharing)是一个比较好的解决方案。 **