导航

js跨域问题

Posted on 2012-06-16 15:53  surealland  阅读(341)  评论(0编辑  收藏  举报
关于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可直接访问。