http://www.tuicool.com/articles/raYFVjV
一 Discuz論壇搭建步驟
1:服務器環境配置
服務器要支持php語言+支持mysql 5.0以上的數據庫 + Apache服務器(支持網站的一個服務器,通過域名的能訪問就可以了)
Msql5.0以上的數據庫一個。
2:安裝Discuz
(1)下載Discuz源碼包 http://www.discuz.net/thread-3570835-1-1.html
(2)解壓源碼包Discuz_X3.2_SC_GBK.zip(這里以Discuz X3/2為例)有三個文件,把 其中的upload文件夾里面的內容放在網站的根目錄下。
注意:
是upload文件夾下面的所有內容放入網站根目錄下,如果把upload整個文件夾放在網站根目錄訪問的地址就是 http://localhost/upload )
(3)訪問域名地址就開始安裝如圖:參考地址:
http://jingyan.baidu.com/article/ac6a9a5ea76e022b653eacca.html
配置數據庫信息:
提前創建好mysql數據庫,用戶/密碼,這里進行配置。同時給設置一個管理員賬號和密碼:點擊下一步
注意:一定是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網站端的配置
1、從“ discuz-ucenter-api-for-java ”的開源項目網站中下載相關的API文件,也可以從這里下載:JAVA_UCenter.zip
這里給一個比較好的下載地址,包括源碼,及jar包文件:
http://code.google.com/p/discuz-ucenter-api-for-java
2、將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>
3、JAVA端配置完成,在eclipse中啟動調試模式
4、再次返回到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();
|
這樣還不行,解密出來的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