1 什么是jsonp
- 首先,因为ajax无法跨域,然后开发者就有所思考
- 其次,开发者发现, <script>标签的src属性是可以跨域的
- 把跨域服务器写成 调用本地的函数 ,回调数据回来不就好了?
- json刚好被js支持(object)
- 调用跨域服务器上动态生成的js格式文件(不管是什么类型的地址,最终生成的返回值都是一段js代码)
- 这种获取远程数据的方式看起来非常像ajax,但其实并不一样
- 便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP。
- 传递一个callback参数给跨域服务端,然后跨域服务端返回数据时会将这个callback参数作为函数名来包裹住json数据即可
2 jsonp 应用场景
js跨域通信
缺点:
1、只支持get
2、安全问题(callback参数恶意添加script标签,造成xss漏洞、跨域请求滥用,阻止非法站点恶意调用)
3 jsonp 如何使用
image.png3.1 简单实现
远程服务器remoteserver.com根目录下有个remote.js文件代码如下:
localHandler({
"result":"我是远程js带来的数据"
});
现在我们在jsonp.html页面定义一个函数,然后在远程remote.js中传入数据进行调用。
jsonp.html页面代码如下:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var localHandler = function(data){
alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
};
</script>
<script type="text/javascript" src="http://remoteserver.com/remote.js"></script>
</head>
<body></body>
</html>
运行之后查看结果,页面成功弹出提示窗口,显示本地函数被跨域的远程js调用成功,并且还接收到了远程js带来的数据
3.2 优化
服务端提供的js脚本是动态生成,调用者可以传一个参数过去告诉服务端“我想要一段调用XXX函数的js代码,
服务器就可以按照客户端的需求来生成js脚本并响应
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
// 得到航班信息查询结果后的回调函数
var flightHandler = function(data){
alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
};
// 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";
// 创建script标签,设置其属性
var script = document.createElement('script');
script.setAttribute('src', url);
// 把script标签加入head,此时调用开始
document.getElementsByTagName('head')[0].appendChild(script);
</script>
</head>
<body></body>
</html>
flightHandler({
"code": "CA1998",
"price": 1780,
"tickets": 5
});
网友评论