jsonp跨域原理javascript
<script>标签没有跨域限制php
json和jsonp的区别html
json是一种基于文本的数据交换方式,或者叫作描述数据的一种格式。java
var person = { "name": "test", "age": "25", "sex": "男" }; var data = [1, 2, 3, 4, 5];
而jsonp是一种非官方跨域数据交互协议,该协议容许用户传递一个callback参数给服务端,而后服务端返回数据时会将这个callback参数做为函数名来包裹住json数据,这样客户端就能够随意定制本身的函数来自动处理返回数据了。
好比我在a.com的网站上引用了b.com的一个b.js,但这样跨域的引用并不会产生错误,说明调用js文件时不受跨域的影响。jquery
<script type="text/javascript" src="http://www.b.com/b.js"></script>
那么咱们在b.js里添加以下代码,看看是否可以执行ajax
alert("I from b");
肯定是能够执行。json
请求方式跨域
若是使用jsonp进行跨域请求,所用到的请求方式只能是 get,在php后台接收不到$_POST的请求数据。浏览器
实例app
jsonptest.html 页面主要代码
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $.ajax({ url : "http://ip/jsonpreturn.php", // 远程IP地址或域名 dataType:"jsonp", data:{ "name":"xiaoming", "pass":"123456" }, type:"post", // 就算使用post,在浏览器中也会变成get方式 jsonp:"callback", timeout: 5000, success:function(data){ console.log(data); }, error:function(XHR, textStatus, errorThrown){ console.log('error: ' + textStatus); console.log('error: ' + errorThrown); } }); }); </script>
jsonpreturn.php主要代码
<?php $name = $_GET['name']; // _POST接收不到数据 $pass = $_GET['pass']; $jsonp = $_GET['callback'];//get接收jsonp自动生成的函数名 $arr = array( 'name' => $name, 'pass' => $pass ); echo $jsonp.'('. json_encode($arr). ')'; //jsonp函数名包裹json数据 ?>