java和Discuz論壇實現單點登陸,經過Ucenter(用戶管理中心)

http://www.tuicool.com/articles/raYFVjV

 

一 Discuz論壇搭建步驟

1:服務器環境配置

服務器要支持php語言+支持mysql 5.0以上的數據庫 + Apache服務器(支持網站的一個服務器,經過域名的能訪問就能夠了)php

Msql5.0以上的數據庫一個。html

2:安裝Discuz

(1)下載Discuz源碼包 http://www.discuz.net/thread-3570835-1-1.htmljava

(2)解壓源碼包Discuz_X3.2_SC_GBK.zip(這裏以Discuz X3/2爲例)有三個文件,把           其中的upload文件夾裏面的內容放在網站的根目錄下。mysql

注意:web

是upload文件夾下面的全部內容放入網站根目錄下,若是把upload整個文件夾放在網站根目錄訪問的地址就是 http://localhost/upload )sql

(3)訪問域名地址就開始安裝如圖:參考地址:數據庫

http://jingyan.baidu.com/article/ac6a9a5ea76e022b653eacca.htmlapi

配置數據庫信息:服務器

提早建立好mysql數據庫,用戶/密碼,這裏進行配置。同時給設置一個管理員帳號和密碼:點擊下一步cookie

注意:必定是mysql 5.0以上的數據庫版本

若是沒有問題的話就安裝成功了。它會自動建立對應的數據庫表等相關信息。

而後訪問域名就直接能夠訪問論壇了。

3:Discuz的簡單配置介紹

(1)前臺登陸及管理員功能

若是是管理員的話會有一些管理信息

若是是管理員瀏覽帖子的話,會有「置頂」,「精華」,「明亮」等操做,如圖:

具體還有不少,這裏不一一介紹。

(2)後臺管理心中

管理中心,就是進入後臺管理的入口。主要是網站的風格,和佈局

管理中心後臺有不少功能,首先須要設置的是論壇大體板塊,以下圖:

對應的前臺以下圖:

我理解的時間也有限,具體設置還須要多進行操做,這裏不進行逐個說明。

二 Discuz論壇與java無縫對接(單點登陸)

1: Discuz和java對接的原理

Discuz和java對接須要一箇中間件,它就是Ucenter。Comsenz(康盛)的UCenter當前在國內的單點登陸領域佔據絕對份額,其完整的產品線令UCenter成爲了帳號集成方面事實上的標準。基於UCenter,能夠將Comsenz旗下的Discuz!(社區論壇系統)、SupeSite(門戶CMS系統)、X-Space(博客系統)從用戶資源層面進行無縫整合,使得帳號實現統一管理,在任何一個系統中進行註冊、登陸、註銷等操做時,該帳號在其餘系統中的會話狀態也將同步更新,最終實現一號通的單點登陸模式。

使用ucenter進行同步操做,主要依託於ucenter  server 和ucenter client之間的api接口進行通信。要使得通信成爲可能,首先要經過ucenter管理所用應用(經過配置使得當前應用和ucenter產生聯繫,也就是通信成功)。其餘應用經過掛接到ucenter的接口上,從而使得某些數據能夠進行同步操做。

2 : Discuz和Ucenter通道的配置

(1)Ucenter用戶管理中心的簡單介紹

Discuz和Ucenter都屬於Comsenz(康盛)公司的產品,因此Discuz和Ucenter之間的通訊通道很是容易創建。

Discuz中附帶的有Ucenter應用程序例如:

以前Discuz論壇安裝以後訪問地址是http://localhost/ upload,那麼Ucenter的訪問地址是http://localhost/ upload/uc_server,登陸界面以下:

輸入以前的管理員密碼便可登陸成功!

後臺管理頁面以下

(2)Ucenter於Discuz通道創建。

咱們若是用的是Discuz自帶的Ucenter,他與Discuz就已經默認是互通的,我能夠直接來用也能夠從新配置。創建成功以下:

註釋:這裏有系統默認的咱們就直接用,下面Ucenter於java創建通道的時候會詳細說明怎麼創建通道,創建通訊通道的方式都是同樣的。

3 : Java和Ucenter通道的配置

(1)Ucenter端添java web網站通道

登陸成功以後

應用管理》添加應用

標紅的爲主要填寫的。其餘的能夠不填寫。

安裝方式:自定義

應用類型:其餘

應用名稱:JAVA項目名稱,可隨意

應用主URL:JAVA項目的訪問地址,例如:http://localhost:8080/javaTest

通訊密鑰:任意字符,例如:123456

應用接口文件名稱: uc.php ,這個不要改,前面也不要加/api/,UCenter在與其通訊時會自動轉換爲: http://localhost:8080/javaTest/api/uc.php

是否開啓同步登陸:是

是否接受通知:是

以上的配置項必填,其餘保持爲空便可 。

點擊「提交」,保存成功後, 記下該 JAVA 應用的 APPID ,下面的配置中會須要。

此時返回應用列表,UCenter會自動進行通訊驗證,不出意外確定會出現「 通訊失敗」的字樣,先沒必要管它

由於java端也須要一些配置

(2)java web網站端的配置

一、從「 discuz-ucenter-api-for-java 」的開源項目網站中下載相關的API文件,也能夠從這裏下載:JAVA_UCenter.zip

這裏給一個比較好的下載地址,包括源碼,及jar包文件:

http://code.google.com/p/discuz-ucenter-api-for-java

二、將JAVA_UCenter.zip解壓、覆蓋到你的JAVA項目中,其中的新文件有:

src/config.properties:本地的JAVA項目與UCenter的接口配置文件( 須要根據實際環境進行配置 )

src/api/ucenter/Base64.java

src/api/ucenter/Client.java: 將經常使用的 UCenter 操做封裝成的客戶端對象,咱們在項目中主要用它來與 UCenter 打交道

src/api/ucenter/PHPFunctions.java

src/api/ucenter/UC.java: 本地的 JAVA 項目用來接收 UCenter 同步命令的Servlet 接口,其訪問地址必須爲: /api/uc.php

src/api/ucenter/XMLHelper.java

WebRoot/WEB-INF/web.xml: 主要就是將 src/api/ucenter/UC.java 定義爲Servlet

注意:

(1) src/config.properties中的代碼以下:

# ================================================

# Ucenter API for JAVA

# ================================================

UC_API = http://localhost:9201

UC_IP = 

UC_KEY = 123456

UC_APPID = 2

UC_CONNECT = 

其中,UC_API表示UCenter的訪問地址,UC_KEY就是在UCenter中添加新應用時定義的通訊密鑰,UC_APPID表示新應用的APPID,就是剛纔記下的那個。

除這三項外,其餘的配置保持爲空便可。

(2) WebRoot/WEB-INF/web.xml中的代碼以下:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" 

xmlns="http://java.sun.com/xml/ns/j2ee" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 

<servlet>

<display-name>同步UC Server發出的操做指令</display-name>

<servlet-name>UC</servlet-name>

<servlet-class>api.ucenter.UC</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>UC</servlet-name>

<url-pattern>/api/uc.php</url-pattern>

</servlet-mapping>

 

</web-app>

別的無所謂,只需注意這一行:<url-pattern>/api/uc.php</url-pattern>

三、JAVA端配置完成,在eclipse中啓動調試模式

四、再次返回到UCenter的控制檯,點擊應用管理,此時應該會看到綠色的「 通訊成功 」字樣

到這裏Discuz和Ucenter之間的通訊通道與java和Ucenter之間的通訊通道都已經創建成功,下面就能夠在2.3.4看具體如何開發

2.3.4  Java端具體代碼實現

(1)java網站web 網站註冊同步Discuz論壇註冊

1> 步驟說明:

註冊java網站web網站 > 調用Client裏面的UC註冊Discuz論壇的接口(uc_user_register) > 判斷註冊結果

2> 具體代碼實現(僅供參考)

//java網站網站的註冊

boolean falg = tempUserService.insert(tempUserVO);

//同步論壇的註冊

if (falg){

Client uc = new Client();

String $returns = uc.uc_user_register(tempUserVO.getUsername(), tempUserVO.getPass(), tempUserVO.getEamil());

int $uid = Integer. parseInt ($returns); 

if ($uid <= 0) { 

if ($uid == -1) { 

System. out .print("用戶名不合法"); 

else if ($uid == -2) { 

System. out .print("包含要容許註冊的詞語"); 

else if ($uid == -3) { 

System. out .print("用戶名已經存在"); 

else if ($uid == -4) { 

System. out .print("Email 格式有誤"); 

else if ($uid == -5) { 

System. out .print("Email 不容許註冊"); 

else if ($uid == -6) { 

System. out .print("該 Email 已經被註冊"); 

else { 

System. out .print("未定義"); 

}

}

System. out .println("id:"+$uid);

System. out .println("添加成功!");

else {

System. out .println("添加失敗!");

}

(2)java網站web 網站登陸,同步Discuz論壇登陸

1> 步驟說明:

登陸民信web網站 > 調用Client裏面的UC登陸接口獲取用戶信息 > 接受返回的用戶XML信息並解析 > 調用Client登陸DIscuz論壇的登陸接口 > 接受返回過來的js代碼 > 輸出到java網站web網站 > 跳轉到論壇地址(此時已經你會發現用戶已經登陸)

2> 具體代碼實現(僅供參考)

//網站的登陸

TempUser tempUser =  tempUserService.queryByName(tempUserVO.getUsername());

System. out .println("結果:"+tempUser.getAddress()+"  =="+tempUser.getEamil());

request.getSession().setAttribute("tempUser", tempUser);

// Discuz 論壇的登陸

Client uc = new Client();

String $result = uc.uc_user_login(tempUser.getUsername(), tempUser.getPass());

String $ucsynlogin = "";

LinkedList<String> rs = XMLHelper. uc_unserialize ($result);

if (rs.size()>0){

int $uid = Integer. parseInt (rs.get(0));

String $username = rs.get(1);

String $password = rs.get(2);

String $email = rs.get(3);

if ($uid > 0) {

$ucsynlogin = uc.uc_user_synlogin($uid);

else if ($uid == -1) {

System. out .println("用戶不存在,或者被刪除");

else if ($uid == -2) {

System. out .println("密碼錯");

else {

System. out .println("未定義");

}

//設置本地 Discuz 登陸的cookie信息,cookie存活時間

//直接訪問論壇就有用戶信息了

try {

response.setCharacterEncoding("UTF-8");

//同步Cookie信息

//                response.addHeader("P3P"," CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");

//              Cookie auth = new Cookie(" auth ", uc.uc_authcode($password+"\t"+$uid , "ENCODE"));

//              auth.setMaxAge(31536000);

//              //auth.setDomain(" localhost ");//設置本地cookie

//              response.addCookie( auth );

//              Cookie user = new Cookie("Discuz_loginuser", $ username );

//              response.addCookie(user);

//把返回過來的 js 文件直接輸出在頁面上,而後跳轉到論壇網站首頁就已是登陸以後的

PrintWriter out = response.getWriter();

out.write($ucsynlogin);

out.flush();           } catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

else {

System. out .println("Login failed");

}

//    System.out.println("登陸的結果:"+$result);

(3)java網站退出,論壇同步退出

1> 步驟說明:

java網站網站註銷 > 調用Client裏面的uc_user_synlogout同時註銷論壇用戶

2> 具體代碼實現(僅供參考)

Client uc = new Client();

String $ucsynlogout = uc.uc_user_synlogout();

System.out.println("退出成功"+$ucsynlogout);

return $ucsynlogout;

(4)java網站修改用戶信息同步論壇資料信息

1> 步驟說明:

修改用戶保存 > 獲取以前論壇用戶信息 > 調用接口進行修改uc_user_edit

2> 具體代碼實現(僅供參考)

Client uc = new Client();

uc.uc_user_edit($username, $oldpw, $newpw, $email, $ignoreoldpw, $questionid, $answer)

主要代碼片斷

(5)論壇登陸同步登陸java網站web

咱們來看看discuz那邊登陸了,java這邊怎麼實現同步登陸。在uc.java裏有一個doanswer的方法。全部同步操做都在這個方法裏完成。其邏輯是這樣的,uc這個類繼承了HttpServlet。當ucenter發出通知時,會訪問這個servlet.並執行他的doGet()方法。doGet()調用doAnswer().

String $code = request.getParameter("code");會傳一個code進來(加密了的)。而後調用$code = new Client().uc_authcode($code, "DECODE");進行解密操做。新建一個Map,Map<String,String> $get = new HashMap<String, String>();而後根據解密出來的code的內容封裝這個Map.調用這個方法,parse_str($code, $get); 通過以上操做後,全部同步操做須要的信息都在map裏,如action。action表明的是什麼操做,如同步登陸,同步退出,修改密碼等。還有其餘信息,如username.登陸的用戶名。改密碼時還會傳新密碼過來。全部的這些都包含在這個叫$get的Map裏。而後咱們就能夠進行咱們本身的邏輯操做了。(以上邏輯不想理解不要緊,你只要知道當你在discuz登陸以後,uc.java的doAnswer()方法就會被調用,你所須要的一切信息都包含在$get這個Map裏)

操做到這裏,你必定想吐槽筆者!不行啊,discuz那邊登陸了,java這邊徹底沒反應啊!!doAnswer方法沒有被調用啊!是的,你還須要到discuz後臺作一些設置。管理中心->站長->ucenter設置。把ucenter鏈接方式改成接口方式。而後,你登陸discuz時,doAnswer()方法就會被調用了。(其餘操做如退出也同樣)

注意亂碼問題:

Discuz登陸同步java網站web網站登陸,中文亂碼問題

到這裏,咱們又遇到了中文的問題了,discuz用中文登陸的時候不行啊!是的,這確實是個比較麻煩的問題。筆者也弄了很久。緣由是這樣的,上面提到過,傳進來的$code是須要uc_authcode()方法進行解密的,當中文的時候解密出來的$code是"".解決方法以下:在Client.java的uc_authcode()方法裏找到這句String $result = $result1.substring(0, $result1.length());並把它改爲:

?

1

2

3

4

5

6

7

String $result= $result1.toString();

try{

$result=new String($result.getBytes("iso-8859-1"),"GBK");

}catch (Exception e) {

$result = $result1.substring(0, $result1.length());

// TODO: handle exception

}

這樣還不行,解密出來的code中文部分還是亂碼。因此在uc.java的$code = new Client().uc_authcode($code, "DECODE");這句下面還要加上$code = new String($code.getBytes("GBK"),"UTF-8");可能有人會說直接轉成utf-8不行嗎?爲何要先轉成gbk呢?若是直接轉成utf-8的話,解密出來的$code是""。到此中文的問題就獲得解決了。筆者下載的是GBK版本的discuz,其餘狀況本身改一下編碼應該沒問題。

參考資料 http://my.oschina.net/u/1274710/blog/165570

參考資料 http://www.cnblogs.com/netWild/archive/2013/06/28/3161164.html

相關文章
相關標籤/搜索