您的位置:首页 > 编程语言 > Java开发

Java整合Discuz同步登录注意事项

2017-11-10 16:50 645 查看
摘要: 笔者是写Java的,之前也没碰过PHP和Discuz,在整合登录的时候碰到了不少坑,在这里记录下

笔者是写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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Discuz! 同步登录