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

相關文章
相關標籤/搜索