您的位置:首页 > 其它

解决其他系统和discuz同步登录和退出的问题!

2014-02-28 11:52 281 查看
需求:站点是由两个系统组成的分别是基于TP的yourphp和discuz,yourphp作为一个新闻站,而discuz作为一个论坛模块,新闻站只提供用户新闻浏览得功能,用户不能注册,只能浏览新闻,论坛提供注册,在网站的首页提供了用户登陆的入口,

出现的问题:

discuz提供了一个用户登录的入口“bbs/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes”,用户在网站填写信息的时候其实是提交到论坛里面进行登陆,登陆过程是在论坛进行的。那么网站首页的那个登陆框因为没有判断用户是否登录,所以即使用户登陆之后还是会显示登陆框,这就出现了一个问题,怎么在不同 的系统判断用户是否登陆。

通过查资料,我找到了这两篇文章

discuz session机制流程图http://www.super-jin.com/?p=55

Discuz 的 session 机制     http://my.oschina.net/xieyunzi/blog/161756#OSC_h2_1   这两篇文章简述了discuz的session机制



这里值得注意的是,当用户退出的时候,会执行一个叫clearcookie的方法,这个方法是把用户的所有COOKIE清空,而SID是存在COOKIE里的,这时候要是清空了COOKIE则SID的值就会被改变了

为了保持当前这个用户的SID(不管登录、还是退出,SID的值都一样,模拟会话的基本原理),DX用了一个小技巧,即在退出的时候,调用了showmessage方法

showmessage方法是DX通用的提示跳转方法,调用这个方法会给用户一个很好的提示页面





但是在这个页面里,他会加载footer.htm模板,这个模板里执行了updatesession方法,而这个方法里会把SID再重新种到COOKIE里

即:

清除SID的COOKIE  –> 调用showmessage –> 调用updatesession –>重新种上SID的COOKIE

这时SID就能从头到尾保持不变了。



这两篇文章讲了discuz的session原理

我查询pre_common_session表,的确是当用户登陆的时候,会把session信息保存在这个表里,这个表中有如下字段



当用户登陆的时候uid不为“0“     username不为空,所以我们可以根据此判断用户是否登录

下面会出现第二个问题,我根据什么条件查询用户的username是否为空呢?那个where条件后面该怎么写?

答案就是我们需要获取表中的sid的值。并根据这个值查询数据表,

下面给大家讲解一下怎么获得这个sid的值

<?php
require dirname(__FILE__). '/config/config_global.php'; //discuz 的配置文件
$c_pre = $_config['cookie']['cookiepre'].substr(md5($_config['cookie']['cookiepath'].'|'.$_config['cookie']['cookiedomain']), 0, 4).'_';
$sid = $_COOKIE[$c_pre.'sid'];


这段代码就是在网上找到的查询保存在本地cookie中的sid的值得代码,

引入的config_global.php就是需要导入的discuz的配置文件

在改配置文件中我们可以看到这样几行配置信息

// --------------------------  CONFIG COOKIE  --------------------------- //
$_config['cookie']['cookiepre'] = 'LXyb_';
$_config['cookie']['cookiedomain'] = '';
$_config['cookie']['cookiepath'] = '/';
对应上面你发现了什么?
打印的cookie就是配置文件

LXyb_2132_sid"]=>string(6) "xYkv4g"

LXyb_
我们可以模拟这个数值

则$_COOKIE['"LXyb_2132_sid']就是我们想要的数据,就是那个seesion表中的sid

至此你就可以使用这个sid查询用户是否登陆的状态了。

这为本人两天的总结,其实最后发现其实很简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息