JSONP——JSON with Padding

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性

受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。

JSONP(JSON with Padding)是一个非官方的协议,允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(是JSONP简单的实现形式)

作用:

  由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

执行过程:

  (1)在客户端注册一个callback, 然后把callback的名字传给服务器

  (2)服务器先生成 json 数据

  (3)以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp

  (4)将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端

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

js

<script type="text/javascript" src="jquery.js"></script>  
<script type="text/javascript">  
    $.ajax({  
        url:"http://crossdomain.com/services.php",  
        dataType:'jsonp',  
        data:'',  
        jsonp:'callback',  
        success:function(result) {  
            for(var i in result) {  
                alert(i+":"+result[i]);//循环输出a:1,b:2,etc.  
            }  
        },  
        timeout:3000  
    });  
</script>  

服务端php

<?php  
  
  //服务端返回JSON数据  
  $arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);  
  $result=json_encode($arr);  
  //echo $_GET['callback'].'("Hello,World!")';  
  //echo $_GET['callback']."($result)";  
  //动态执行回调函数  
  $callback=$_GET['callback'];  
  echo $callback."($result)";  

jquery和ext等框架都把jsonp作为ajax的一种形式进行了封装

缺点:

  没有关于 JSONP 调用的错误处理

  被不信任的服务使用时会很危险