前段时间在应用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;
}
第二步:中转接受cookietimeucenter我们可以把他当成是中转站的功能,接受一个应用的数据,然后同步到各个应用当中。所以接下来找到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。