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

笔者是写Java的,以前也没碰过PHP和Discuz,在整合登陆的时候碰到了很多坑,在这里记录下php

Java整合Discuz同步登陆

具体代码和逻辑见一下链接 http://www.cnblogs.com/netWild/archive/2013/06/28/3161164.htmlhtml

我的整合时碰到的问题

首次访问时速度很慢

使用上面连接中的Demo时,在第一次调用的时候会卡上2分钟左右,控制台打印如下信息: Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] milliseconds前端

有两种解决办法:java

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/52597645api

调用登陆返回html后页面报错

查看网页源码,发现script请求地址为127.0.0.1 跨域

解决方法: 进入UCenter中,在应用管理中将Discuz的访问路径配置为论坛访问地址 cookie

调用登陆后返回html空白页

虽然显示空白页,可是登陆状态已经同步到Discuz了,只须要刷新下Discuz页面便可。 这里我的的解决方法是: 第一种方法:当调用Discuz登陆接口返回script字符串后,在后端手动处理,添加一段跳转JS,这样页面会自动跳转到目标地址。session

第二种方法:本质上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

相关文章
相关标签/搜索