前端技术

当前位置:首页 > 前端技术 >

AJAX跨域请求之JSONP

时间:2015-09-25        阅读:次        QQ群:182913345

        1、什么是JSONP?
        JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。
 
        2、JSONP有什么用?
        由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。
 
        3、如何使用JSONP?
        下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。
 
        客户端JS代码在jQuery中的实现方式:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
  $.ajax({
    url:"http://www.php520.cn/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代码(services.php):

<?php
	//服务端返回JSON数据
	$arr=array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
	$result=json_encode($arr);

	//动态执行回调函数
	$callback=$_GET['callback'];
	echo $callback."($result)";

        Jsonp原理:
        首先在客户端注册一个callback, 然后把callback的名字传给服务器。
        此时,服务器先生成 json 数据。
        然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp。
        最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
        客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里(动态执行回调函数)。
 
        主要提示:
        JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。
        第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。
        第二,JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。

上一篇:JS常用正则表达式整理

下一篇:HTML5获取地理位置信息

扫一扫,更多精彩内容推送

PHP技术分享

分享PHP技术,前端技术,数据库,SEO优化,服务器,网络安全等知识,是php程序员工作学习的好帮手!

Copyright © 2013-2015.PHP技术分享 www.php520.cn  版权所有  网站地图    PHP学习交流群

免责声明:网站内容收集于互联网,本网站不承担任何由于内容的合法性及健康性所引起的争议和法律责任。

欢迎大家对网站内容侵犯版权等不合法和不健康行为进行监督和举报。 沪ICP备15014499号-2