笔者是写Java的,之前也没碰过PHP和Discuz,在整合登录的时候碰到了不少坑,在这里记录下
Java整合Discuz同步登录
具体代码和逻辑见一下连接 http://www.cnblogs.com/netWild/archive/2013/06/28/3161164.html
个人整合时碰到的问题
首次访问时速度很慢
使用上面链接中的Demo时,在第一次调用的时候会卡上2分钟左右,控制台打印以下信息: Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] milliseconds
有两种解决办法:
1)在Tomcat环境中解决 可以通过配置JRE使用非阻塞的Entropy Source。 在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。 加入后再启动Tomcat,整个启动耗时下降到Server startup in 2912 ms。
2)在JVM环境中解决 打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容: securerandom.source=file:/dev/urandom 替换成 securerandom.source=file:/dev/./urandom
参考连接:http://blog.csdn.net/trackal/article/details/52597645
调用登录返回html后页面报错
查看网页源码,发现script请求地址为127.0.0.1
解决方法: 进入UCenter中,在应用管理中将Discuz的访问路径配置为论坛访问地址
调用登录后返回html空白页
虽然显示空白页,但是登录状态已经同步到Discuz了,只需要刷新下Discuz页面即可。 这里个人的解决方法是: 第一种方法:当调用Discuz登录接口返回script字符串后,在后端手动处理,添加一段跳转JS,这样页面会自动跳转到目标地址。
第二种方法:本质上Discuz就是通过script标签的跨域性来请求目标接口实现传递登录状态,可以在后端截取该url,返回给前端,由前端处理。
登录script执行成功后,Discuz仍然没有登录状态?
因为通过同步注册接口进行注册的用户没有激活,所以需要手动在Discuz登录一次激活,同步登录才会生效。
Discuz登录后自动激活设置
这样设置后,只是在Discuz登录的时候不需要手动输入验证码来激活,但上面的问题还没有解决。
同步注册后自动激活
//打开discuz/api/uc.php
//synlogin方法(180行)处,往下找到
if(($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
//改为
if(($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
} else {
if(!function_exists('uc_get_user')) {
loaducenter();
}
$user = uc_get_user($uid, 1);
if($user) {
$time = time();
DB::query("REPLACE INTO ".DB::table('common_member')." SET `uid`='{$user[0]}' , `username`='{$user[1]}' , `password`='".md5(random(10))."' , `email`='{$user[2]}' , `adminid`='0' , `groupid`='10' , `regdate`='{$time}' , `emailstatus`='0' , `credits`='0' , `timeoffset`='9999'");
DB::query("REPLACE INTO ".DB::table('common_member_status')." SET `uid`='{$user[0]}' , `regip`='{$_G['clientip']}' , `lastip`='{$_G['clientip']}' , `lastvisit`='{$time}' , `lastactivity`='' , `lastpost`='0' , `lastsendmail`='0'");
DB::query("REPLACE INTO ".DB::table('common_member_count')." SET `uid`='{$user[0]}' , `extcredits1`='0' , `extcredits2`='0' , `extcredits3`='0' , `extcredits4`='0' , `extcredits5`='0' , `extcredits6`='0' , `extcredits7`='0' , `extcredits8`='0'");
DB::query("REPLACE INTO ".DB::table('common_member_profile')." SET `uid`='{$user[0]}'");
DB::query("REPLACE INTO ".DB::table('common_member_field_forum')." SET `uid`='{$user[0]}'");
DB::query("REPLACE INTO ".DB::table('common_member_field_home')." SET `uid`='{$user[0]}'");
DB::query("UPDATE ".DB::table('common_stat')." SET `register`=`register`+1 WHERE `daytime` = '".date('Ymd', $time)."'");
if(($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
}
}
修改完后,同步注册后就会直接激活了,现在调用同步登录后就能直接同步登录状态了。
参考连接:http://blog.csdn.net/dongsg11200/article/details/24609783
同步注册后自动激活(第二种方法)
多程序整合 UCenter,在新用户首次注册后是没有同步登录到其它程序的,也就是说用户得在其它程序用密码再登录一次,以后才能同步登录,还有就是用户不是在 Discuz 程序注册的话,在 Discuz 登录时得手动激活,这些都导致用户体验很不好,不过解决方法很简单~ 修改各个程序目录下的 ./uc_client/model/user.php 文件,大概在 129 行处的 function add_user 函数里添加代码 如 Discuz X 的:多程序整合 UCenter,在新用户首次注册后是没有同步登录到其它程序的,也就是说用户得在其它程序用密码再登录一次,以后才能同步登录,还有就是用户不是在 Discuz 程序注册的话,在 Discuz 登录时得手动激活,这些都导致用户体验很不好,不过解决方法很简单~ 修改各个程序目录下的 ./uc_client/model/user.php 文件,大概在 129 行处的 function add_user 函数里添加代码 如 Discuz X 的: Discuz 的参数比较多,
dbname
是数据库名,.pre_ 是表前缀,按自己的情况修改
$this->db->query("INSERT INTO `dbname`.pre_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_profile SET uid='$uid'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_field_forum SET uid='$uid'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_field_home SET uid='$uid'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");
我的是Discuz3.4,按照这种方法修改后并没有效果,可能是版本不同?。
参考连接:http://blog.csdn.net/iastro/article/details/52587643 参考连接2:https://www.cnblogs.com/seaning/p/3993068.html