最新消息: 新版网站上线了!!!

实现phpcms和discuz的Cookie同步,解决关闭浏览器phpcms退出discuz没退出

如何实现phpcms和discuz的Cookie同步


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



第一步: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。


转载请注明:谷谷点程序 » 实现phpcms和discuz的Cookie同步,解决关闭浏览器phpcms退出discuz没退出