美文网首页
理解jsonp

理解jsonp

作者: 饿了爸 | 来源:发表于2019-08-16 17:18 被阅读0次

    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.png

    3.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
    });
    

    相关文章

      网友评论

          本文标题:理解jsonp

          本文链接:https://www.haomeiwen.com/subject/rxdqsctx.html