当前位置:首页 > PHP教程 > php应用 > 列表

php+ajax实现多域名跨域登录例子(基于P3P)

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-11 16:36:01 浏览: 评论:0 

在以前如果我们要实现php+ajax实现多域名跨域登录的话很多朋友都碰到无法正常跨域登录问题,下面我来给大家解决跨域名登录问题,有需要的参考.

该同步登陆需求需满足以下三个关键点:

1)A域名下登陆的用户,跳转到B域名下时实现同步登陆.

2)B域名下点击A域名下的退出链接,实现A域名与B域名的同时退出.

3)用户直接访问B域名时,可以自动判断A域名下是否存在用户登录,如果存在,则实现B域名下的用户同步登陆.

首先解决跨域的同步登陆登出,有以下可行的解决思路.

1)两个域共享SESSION服务器,即统一的内存服务器,这样两个域下的SESSIONID会相同,会自动无缝实现同步登陆登出,但该解决方案需要额外的硬件投入,并且需要懂这方面部署的技术人员.

2)通过url传递sessionid

3)通过P3P协议获取跨域的SESSION

为解决该需求,我经过查询各种资料,并拟定了自己的一套解决方案,分享给大家,其要点如下:

1)当用户在A域名下登录后,访问A域名下网站时,会ajax请求B域下的js脚本文件,写入B域COOKIE及SESSION,实现B域下登录.

2)当用户在A域名下退出后,访问A域名下网站时,会ajax请求B域下的js脚本文件,同登录参数不同,清除B域COOKIE及SESSION,实现B域下登出.

3)当用户直接访问B域网页时,请求A域下脚本,判断A域下是否存在登录,如果存在,则将COOKIE及SESSION赋值到当前域的网页中,通过ajax实现当前域.

COOKIE及SESSION的写入.

我将a域名设定为A域名,B域名设定为B域名,以下是相关代码:

  1. #############a域名ApiController.php ################# 
  2.  /*  
  3.   * 根据当前域(a域名)的cookie信息设置bstv域下的cookie及session 
  4.   * 如果为空,则清空处理 
  5.   * */ 
  6.  function setckAction() { 
  7.   $clr = $this->_request->getParam("clr"); 
  8.   $bts_user = ($clr) ? '' : urlencode($_COOKIE['bts_LOGGED_USER']); 
  9.   $this->view->assign("bts_user",$bts_user); 
  10.  } 
  11.  
  12.  /*  
  13.   * 提供给bstv域下,获取当前域(a域名)的cookie及session 
  14.   * 以脚本变量返回给bstv浏览器端 
  15.   * */ 
  16.  function getckAction() { 
  17.   header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); 
  18.   echo 'var ck="'.$_COOKIE['bts_LOGGED_USER'].'";'
  19.   echo 'var sess="'.$_SESSION['user']['uid'].'";'
  20.   exit(); 
  21.  } 
  22. #############a域名index.php ################# 
  23. ##### 默认指定index.php为登录返回的页面 
  24. <script src="http://www.B域名/api/setck?bts_user={$bts_user}"></script> 
  25. ############# B域名 api.php ################# 
  26.  
  27.  /*  
  28.   * 显示a域名域下的cookie及SESSION 
  29.   * 赋值到js变量 
  30.   * js 通过ajax写入cookie和session:如果a域名已退出,则bstv做退出处理 
  31.   * */ 
  32.  function getbtsck() { 
  33.   include $this->template->getfile('api/getbtsck'); 
  34.  } 
  35.  
  36.  /*  
  37.   * a域名域下设置bstv域下的cookie及session 
  38.   * 如果为空,则清空处理 
  39.   * */ 
  40.  function setck() { 
  41.   header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); 
  42.    
  43.   $bts_user = trim($_GET['bts_user']); 
  44.   if(!emptyempty($bts_user)) { 
  45.    setcookie("bts_LOGGED_USER", urldecode($bts_user), time()+3600*24*365, "/"".B域名"); 
  46.    $this->cookieLoginLocal(urldecode($bts_user)); 
  47.   } else { 
  48.    setcookie("bts_LOGGED_USER"$bts_user'-1'"/"".B域名"); 
  49.    unset($_SESSION['uid']); 
  50.   } 
  51.  } 
  52.  
  53.  function setsession() { 
  54.   $bts_user = trim($_POST['bts_user']); 
  55.   if(!emptyempty($bts_user) && emptyempty($_SESSION['uid'])) { 
  56.    setcookie("bts_LOGGED_USER", urldecode($bts_user), time()+3600*24*365, "/"".B域名"); 
  57.    $this->cookieLoginLocal(urldecode($bts_user)); 
  58.   } else { 
  59.    echo 'uuunset'
  60.    setcookie("bts_LOGGED_USER"$bts_user'-1'"/"".B域名"); 
  61.    //unset($_SESSION['uid']); 
  62.   } 
  63.  } 
  64.  
  65.  function cookieLoginLocal($cookieId){ 
  66.   $cookieId = explode'.'base64_decode($cookieId) ); 
  67.   if ($cookieId[0] !== 'baitianshi' || emptyempty($cookieId[1])) { 
  68.    return false; 
  69.   } else { 
  70.    return $this->loginLocal($cookieId[1],false,1); 
  71.   } 
  72.  } 
  73.  
  74.  function loginLocal($uid,$password=false,$isuid=0) { 
  75.   $_SESSION['uid'] = $uid
  76.   return 1; 
  77.  } 
  78. ############# B域名 getbtsck.html ################# 
  79. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  80. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
  81. <head> 
  82.  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />  //开源软件:phpfensi.com 
  83.  <title>同步登陆</title> 
  84.  <script src="/js/jquery-1.8.1.min.js" type="text/javascript"></script> 
  85.     <script src="/api/getck"></script> 
  86.  <script language="javascript"
  87.  function setck(bts_user) { 
  88.   $.post("/api/setsession",{bts_user:bts_user},function(re){ });} 
  89.   setck(ck); 
  90.     </script> 
  91. </head> 
  92. <body> 
  93. </body> 
  94. </html> 

该方案尚存在的不足:当用户直接访问B域时,需要加载一次该页面后,才能判断是否在A域登录,并写入当前域(B域)的SESSION.

Tags: php+ajax php域名跨域登录

分享到: