java里沒有好的論壇,唯一好的大概就是jsprun,這個(gè)是仿discuz論壇,不過貌似團(tuán)隊(duì)不做了,也停止了更新了
最近項(xiàng)目里需要一個(gè)論壇,碰巧我以前是做php的,對(duì)于discuz ucenter以前也做過單點(diǎn)登錄,于是開始把discuz整合進(jìn)項(xiàng)目中.
首先先安裝ucenter,與discuz整合,如果不知道ucenter是什么?請(qǐng)自行百度.
現(xiàn)在的discuz項(xiàng)目直接下載下來在安裝的時(shí)候會(huì)讓你選擇是否整合進(jìn)ucenter,選擇是就行了,如果是已經(jīng)的論壇請(qǐng)自行整合進(jìn)ucenter.
java項(xiàng)目中有人已經(jīng)編寫了discuz-ucenter-for-java.我們用這個(gè)插件就可以實(shí)現(xiàn)java與php的對(duì)接的
先去https://code.google.com/p/discuz-ucenter-api-for-java/downloads/list下載discuz-api-for-java..
本人的環(huán)境:
apache-php :80端口
java:8080端口
網(wǎng)上也可以把php整合進(jìn)tomcat,讓php和java都用同一個(gè)端口,具體方法我就不講述
我這里php和java分別用的是2個(gè)端口
工具都差不多了.下面開始步驟了.
1:進(jìn)入ucenter后臺(tái).ucenter->應(yīng)用管理->添加新應(yīng)用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!-- discuz論壇ucenter整合 --> <servlet> <servlet-name> api </servlet-name> <servlet-class> com.fivestars.interfaces.bbs.api.UC </servlet-class> <load-on-startup> 2 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> api </servlet-name> <url-pattern> /api/uc.php </url-pattern> </servlet-mapping> <!-- discuz論壇ucenter整合 --> |
1 2 3 4 5 | UC_API = http://localhost/discuz/uc_server UC_IP = UC_KEY =x2ydu036Ubtf55gfyf2bR7Mc62v2a7J7rcrdA9Ncx259B323wegb87P5l7CaYd34 UC_APPID = 2 UC_CONNECT = |
UC_IP可以不填,會(huì)自動(dòng)根據(jù)域名解析該IP
UC_KEY就是通訊密鑰
UC_APPID就是ucenter添加應(yīng)用的ID
配好就可以,通訊就應(yīng)該成功了.
如果不成功,請(qǐng)?zhí)砑觟p.還有注意config.properties的路徑,我是自己修改了名字和路徑..修改路徑的話記得去Client.java里修改路徑,因?yàn)樗@里會(huì)讀取config.properties
接下來就是關(guān)于discuz-api-for-java的一些api
1:同步注冊(cè)
1 2 3 4 5 6 7 8 9 10 11 | Client discuzClient = new Client(); discuzClient.uc_user_register("zhangsan","password","zouhao619@gmail.com"); /** -1 : 用戶名不合法 -2 : 包含不允許注冊(cè)的詞語 -3 : 用戶名已經(jīng)存在 -4 : email 格式有誤 -5 : email 不允許注冊(cè) -6 : 該 email 已經(jīng)被注冊(cè) >1 : 表示成功,數(shù)值為 UID */ |
2:同步登陸
1 2 3 4 5 6 | Client discuzClient = new Client(); String loginResult = discuzClient.uc_user_login("zhangsan","password");//根據(jù)賬戶密碼獲取用戶相關(guān)信息 LinkedList<String> userInfo=XMLHelper.uc_unserialize(loginResult); uid=Integer.valueOf(userInfo.get(0));//獲取用戶的ID String $ucsynlogin = discuzClient.uc_user_synlogin(uid);//根據(jù)ID進(jìn)行同步登陸 response.getWriter().print($ucsynlogin);//把$ucsynlogin輸出到頁面上就行了.這樣就實(shí)現(xiàn)了同步登陸,實(shí)際上就是一個(gè)script標(biāo)簽可以進(jìn)行跨域的功能 |
注意事項(xiàng):
1:ucenter->注冊(cè)設(shè)置->是否允許同一個(gè)email注冊(cè)多個(gè)用戶根據(jù)自己的實(shí)際情況來決定
2:同步注冊(cè)后,需要到discuz登錄一次,才能實(shí)現(xiàn)同步登錄.如果進(jìn)行同步注冊(cè)后,賬戶沒有登錄,那么也無法實(shí)現(xiàn)同步登錄,如果你要實(shí)現(xiàn)同步注冊(cè)后,就能登錄.就修改uc_server/model/user.php第129行左右的add_user($username, $password, $email, $uid = 0, $questionid = ”, $answer = ”, $regip = ”)方法
修改為如下內(nèi)容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') { $regip = empty($regip) ? $this->base->onlineip : $regip; $salt = substr(uniqid(rand()), -6); $password = md5(md5($password).$salt); $sqladd = $uid ? "uid='".intval($uid)."'," : ''; $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',"; $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'"); $uid = $this->db->insert_id(); $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'"); //begin $this->db->query("INSERT INTO `discuz`.dz_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 `discuz`.dz_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 `discuz`.dz_common_member_profile SET uid='$uid'"); $this->db->query("INSERT INTO `discuz`.dz_common_member_field_forum SET uid='$uid'"); $this->db->query("INSERT INTO `discuz`.dz_common_member_field_home SET uid='$uid'"); $this->db->query("INSERT INTO `discuz`.dz_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'"); //end return $uid; } |
在添加到ucenter的同時(shí)添加到discuz表中.
3:如果你要實(shí)現(xiàn)同步登錄,在頁面輸出discuzClient.uc_user_synlogin(uid),他其實(shí)是一段script,用來跨域訪問的.但是有可能由于網(wǎng)絡(luò)原因,你還沒有發(fā)出這個(gè)請(qǐng)求,你就先跳轉(zhuǎn)頁面了.所以造成無法同步登錄.
我用的方法是,用jquery.$.script()方法來加載這個(gè)js,由于是跨域,$.script()無法有返回,這個(gè)時(shí)候需要在php服務(wù)器端設(shè)置
1 | header("Access-Control-Allow-Origin:*"); //允許任何訪問(包括ajax跨域) |
詳細(xì)代碼如下:
1 2 3 4 5 6 7 | <script> $(function(){ $.getScript('script的目標(biāo)url', function(){ location.href='bbs路徑'; }); }); </script> |
確定執(zhí)行完了這個(gè)js同步登錄后,在執(zhí)行l(wèi)ocation進(jìn)行跳轉(zhuǎn)
聯(lián)系客服