还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

ucenter应用之间cookietime不能传送问题解决

来源:清泛原创     2016-06-27 16:44:58    人气:     我有话说( 0 人参与)

前段时间在应用uchome、discuz、cyask等进行二次开发时遇到了在关闭浏览器时不能同步退出的问题,即ucenter默认是在同步登陆的时候其他的应...

前段时间在应用uchome、discuz、cyask等进行二次开发时遇到了在关闭浏览器时不能同步退出的问题,即ucenter默认是在同步登陆的时候其他的应用的cookie保存时间是315600,所以当一个应用没有勾选直接登陆的时候,该应用在浏览器关闭的时候退出了,但是其他的还是仍旧没有退出。以下是个人的一些解决办法:

第一步:cookietime的传送
        先在配置文件里注册一个全局变量,用来保存cookietime,然后找到你所需要传送cookietime的应用目录下的uc_client的client.php文件,找到uc_user_synlogin函数,默认是
function uc_user_synlogin($uid) {
     $uid = intval($uid);
      $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
     return $return;
}
修改为
function uc_user_synlogin($uid) {
      require_once './include/common.inc.php';
      global $_CGLOBAL;
      $uid = intval($uid);
      $cookietime = $_CGLOBAL['cookietime'];
      $return = uc_api_post('user', 'synlogin', array('uid'=>$uid,'cookietime'=>$cookietime));
      return $return;
}
第二步:中转接受cookietime
       ucenter我们可以把他当成是中转站的功能,接受一个应用的数据,然后同步到各个应用当中。所以接下来找到ucenter/control目录下面user.php,注意不是应用的目录下面的user.php文件。找到onsynlogin函数。即:
function onsynlogin() {
      $this->init_input();
      $uid = $this->input('uid');
      if($this->app['synlogin']) {
            if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
                  $synstr = '';
                  foreach($this->cache['apps'] as $appid => $app) {
                        if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                              $synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this-                              >time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this-         >user['username'].'&uid='.$this->user['uid'].'&password='.$this->user['password']."&time=".$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
                        }
                  }
                  return $synstr;
            }
      }
      return '';
}
修改成
function onsynlogin() {
      $this->init_input();
      $uid = $this->input('uid');
      $cookietime = $this->input('cookietime');
      if($this->app['synlogin']) {
            if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
                  $synstr = '';
                   foreach($this->cache['apps'] as $appid => $app) {
                        if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                              $synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this->time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this->user['username'].'&uid='.$this->user['uid'].'&cookietime='.$cookietime.'&password='.$this->user['password']."&time=".$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
                        }
                  }
                  return $synstr;
            }
       }
      return '';
}
第三步:其他应用接受cookietime:
找到各个应用目录下面的api/uc.php文件,找到里面的function synlogin($get, $post)函数,将里面的cookietime定义变为$cookietime = $get['cookietime'];就可以了
这样一来就完成了$cookietime的在各应用之间的传递

注意:如果接受cookie的应用是phpsso(如phpcms开启phpsso),它里面还有一层通信传递,还需要在 phpsso_server\api\uc.php  加cookietime。

ucenter cookietime 传送

注:本文为本站或本站会员原创优质内容,版权属于原作者及清泛网所有,
欢迎转载,转载时须注明版权并添加来源链接,谢谢合作! (编辑:admin)
分享到: