首页 > 上网技巧 > 电脑小技巧 > JavaScript跨域与JSONP

JavaScript跨域与JSONP

时间:2014-08-30 15:41 作者:QQ地带 我要评论

  跨域问题的产生,最主要原因是COOKIE的安全问题。因为COOKIE是属于一个域的,如果允许跨域,客户端浏览器上储存的COOKIE就可以被它的所有者之外的程序访问到。举个例子吧,假如没有跨域问题,我现在就可以给百度发送个HTTP请求,获取你在百度上登录的用户名。或者获取SessionID,直接冒充你的帐号登录。为了避免这些问题,所以跨域访问的限制是非常有必要的。
  跨域行为通常只是用来给另一个域传递数据而已,对于这个简单的跨域要求很容易做到。在HTML中有着许多标签都是可以跨域访问的,比如IFRAME、IMG、SCRIPT,等。他们都可以跨域发送HTTP请求,所以如果只是单纯的发送而不需要接收数据,只要用任意一个可以发送跨域请求的HTML标签把数据放入URL中发送即可。但是有时候就是需要从另一个域获取数据,这时候通常使用SCRIPT标签,用JSONP的方式传递。这是正统,当然其它标签也不是不可以返回数据,比如IMG标签就可以返回图片的宽高,这也是一个数据,但是这些歪门邪道的方法不推荐使用。JSONP虽然不是正规协议,但是正在逐步迈向正规。至少目前jQuery就可以使用JSONP。
  跨域是一种正常行为,当你拥有许多个网站的时候,你可以实现在自己的网站之间传递数据。但是如果你想用“跨域”盗取其它网站的数据,那还是放弃吧。除非目标网站有给你提供JSONP的接口,或者有某些可以利用的漏洞,要不然真没什么办法实现。
  前面提到了JSONP,现在来说说JSONP到底是个啥。先来看个代码吧
//这是test.php的代码
 
  1. //假如这个$obj是需要传递的对象 
  2. $obj=array('uid'=>1,'usn'=>'次碳酸钴'); 
  3.  
  4. //获取传入的函数名 
  5. $callback=$_GET['callback']; 
  6.  
  7. //如果没传入就使用的默认函数名 
  8. if(!$callback)$callback='jsoncallback'
  9.  
  10. //输出一段JS格式的代码,调用用传入的函数名,参数为需要传递的$obj对象 
  11. echo $callback.'('.json_encode($obj).');'; 
  12. //这段JS所在的文件是和test.php不同的域上的 
  13.  
  14. //回调函数定义 
  15. function mycallback(obj){ 
  16.   //输出传递过来的对象的usn属性 
  17.   alert(obj.usn); 
  18. }; 
  19.  
  20. window.onload=function(){ 
  21.   //创建SCRIPT标签 
  22.   var script=document.createElement("script"); 
  23.   //设置URL 
  24.   script.src="http://www.oicqzone.com/test.php?callback=mycallback"
  25.   //把标签放入文档中以便生效 
  26.   document.body.appendChild(script); 
  27. }; 
  看到上面这个例子就应该明白了,JSONP实际上就是这样一个东西。传入一个回调函数的函数名称,服务器把需要传递的数据作为参数调用那个函数。上面的这个JS用jQuery写会非常简单。
 
  1. $.getJSON( 
  2.   "http://www.oicqzone.com/test.php?callback=?", 
  3.   function(e){ 
  4.     alert(e.usn); 
  5.   } 
  6. ); 
  这样就可以了,所以建议使用JSONP这个。如果不使用它也是可以传递数据的,只不过就没这么方便了,因为JS文件毕竟是死的,如果直接把数据放入全局变量中当然也可以传递,但是就浪费了一个全局变量。这就意味着很有可能和访问网站的JS中固有的全局变量冲突,JSONP就是解决了这个问题。

标签: JS JSONP
顶一下
(1)
100%
踩一下
(0)
0%

Google提供的广告