jsonp

在解决跨域问题时,有一种通过动态创建<script>标签的形式去请求接口的方式叫做jsonp。

jsonp的优缺点

优点

  • 解决跨域
  • 兼容性强
  • 不用使用XMLHttpRequest

缺点

  • 只支持get请求
  • 不支持不同域两个页面间如何进行js调用

jsonp的原理

JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了。

简述原理与过程:首先在客户端注册一个callback, 然后把callback的名字传给服务器。此时,服务器先生成 json 数据。 然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp。最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。

客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里。(动态执行回调函数)

1
2
3
4
5
6
7
8
9
10
11
var script = document.createElement('script');
script.type = 'text/javascript';

// 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
script.src = 'http://www.xxx.com:8080/login?id=1&callback=handleCallback';
document.head.appendChild(script);

// 回调执行函数
function handleCallback(res) {
alert(JSON.stringify(res));
}

服务端返回如下(返回时即执行全局函数)

1
handleCallback({"status": true, "id": "1"})

参考文章

前端常见跨域解决方案(全)