关于js跨域问题,目前只用过的有两种方法,总结一下:
为了说的明白点,写个例子:
本域:http:www.a.com
外域:http:www.b.com
请求的外域文件:http://www.b.com/f.php?key=a&test=justfortest
方法1:jsonp。
json基本原理:通过在html文件中添加script标签,设置标签的src属性值为其他域的server文件地址,返回的数据通过jsonp模式获取。
jsonp模式是:js请求server时,传入一个函数名funca,服务端返回json数据时,用funca包含json。funca(json)。js文件中定义funca为处理callback json的函数。
关于jsonp:必须有server端的代码配合才能实施。(你想访问baidu.com的接口,不能让人家专门给你做一个支持jsonp的接口啦~)
方法2:通过server代理。通俗讲就是在本域的server中建个文件php,在文件中访问外域文件,并获取数据。js请求本域php文件即可。(事实上js没有进行跨域请求)
例子:
方法1例子:
本域js文件如下:
$.ajax({ url:'http://www.b.com/f.php', data:{key:'a',test:'justfortest'}, dataType:'jsonp', //返回的数据遵循jsonp规则 jsonp:'testjsonp', //定义url中表示jsonp的参数名字 jsonpCallback:'onJsonPSuccess' //定义jsonp回调函数的名字,用于处理返回数据。(f.php在返回json时,会用onJsonPSu cess(json数据)) }); function onJsonPSuccess(d){ console.log(d.name,d.age); //tom,11 }
浏览器中捕获的请求:
http://www.b.com/f.php?testjsonp=onJsonPSuccess&key=a&test=justfortest&_=1339832259715(随机数,无catche)
外域f.php处理数据如下:(即如何配合jsonp)
$ret=array('name'=>'tom','age':11); $ret_j=json_encode($ret); if($_GET['test']=='justfortest'){ echo "{$_GET['testjsonp']}({$ret_j})"; //testjsonp='onJsonPSuccess';相当于执行js方法,只不过此js方法名是你预先传给它的。 }
----------------------------------------------------------------------------------
方法2例子:php文件通过curl模拟浏览器访问。在请求头信息中设置domin为同域。
$rnd=rand(0,1); $url = "http://www.b.com/f2.php?rnd=".$rnd;//去cache+$rnd $ch = curl_init(); $refer = 'http://www.b.com'; $header=array("Content-type"=>"application/json"); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_REFERER, $refer ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); $ret = curl_exec($ch); curl_close($ch);
$ret即为得到的数据。
本地js可直接访问。