Java項目實現(xiàn)與Discuz和Ucenter同步登錄

2013-04-03 14:34:16來源:iteye作者:

經(jīng)過多番嘗試,終于將現(xiàn)有網(wǎng)站與discuz接入成功。具體思路和做法下面會給出詳細(xì)的描述。希望對別人也有所幫助。進(jìn)入正題。

經(jīng)過多番嘗試,終于將現(xiàn)有網(wǎng)站與discuz接入成功。具體思路和做法下面會給出詳細(xì)的描述。希望對別人也有所幫助。進(jìn)入正題。

之前網(wǎng)站結(jié)合的是一個基于jsp的論壇,對于相同的平臺,所以用戶接入不是什么問題。因為總總原因,現(xiàn)決定采用discuz的解決方案。

第一:關(guān)于discuz版本,目前discuz最新的發(fā)布版本是discuz!x 1.5

較之前7.0版本前,與之相關(guān)最大的區(qū)別就是以往用來做用戶接入的api更換了。7.0之前是passport。實現(xiàn)的原理與我們之前結(jié)合jsp論壇有點類似,論壇在注冊 登錄 退出3個關(guān)鍵的地方,會在url后帶一系列參數(shù),簡單的描述,實質(zhì)就是調(diào)用的注冊,登錄都是主站的。相當(dāng)于隱藏了論壇自身的登錄注冊等模塊,只是把主站的用戶數(shù)據(jù)按照規(guī)則同時寫入論壇,另外同步好兩個站點直接的cookie,session就好了。呵呵,個人感覺這種實現(xiàn)其實蠻好的,論壇只是依附在主站上。認(rèn)證登錄都很統(tǒng)一。但在目前sns大行其道的年代,網(wǎng)站也不僅僅只局限跟自己交互,總希望更好的擴(kuò)展,聚合更多的東西。所以才有了如下的解決方案--ucenter。這里把它從discuz獨立出來。事實上康盛也確實把它作為一個獨立的產(chǎn)品發(fā)布的。

第二:java網(wǎng)站結(jié)合uc,首先明確uc的概念

UCenter 簡介

UCenter 的中文意思就是“用戶中心”,其中的 U 代表 User 也代表 You,取其中的含義就是“用戶中心”,或者說“你(最終用戶)的中心”。UCenter 是今后 Comsenz 旗下各個產(chǎn)品之間信息直接傳遞的一個橋梁,通過 UCenter 站長可以無縫整合 Comsenz 系列產(chǎn)品,甚至其它更多的第三方應(yīng)用程序,實現(xiàn)用戶的一站式登錄,個人信息、積分等的統(tǒng)一管理。

第三:uc的java api http://code.google.com/p/discuz-ucenter-api-for-java/

操作步驟:

1:設(shè)置通信,進(jìn)uc后臺配置http://faq.comsenz.com/usersguide

2:修改自己的網(wǎng)站,將上面提到的java api中的代碼或者jar包添加到自己的項目中,著重配置好config.properties

#
# ================================================
# * Discuz! Ucenter API for JAVA
# ================================================
# UC comunication settings

#
#uc server url
UC_API = http://192.168.1.109/bbs/uc_server #你的uc api接口地址
#uc ip address
UC_IP = 192.168.1.109

#key
UC_KEY = ********* #跟上步設(shè)置的私匙 key一樣

#appid
UC_APPID = 2 #應(yīng)用id

#connect mode: default value is ""
UC_CONNECT = mysql

3:修改注冊 登錄 退出相關(guān)代碼

注冊部分代碼

Client uc = new Client();
  
  String $returns = uc.uc_user_register(user.getUsername(), "***", user.getEmail());
  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("用戶名已經(jīng)存在");
   } else if ($uid == -4) {
    System.out.print("Email 格式有誤");
   } else if ($uid == -5) {
    System.out.print("Email 不允許注冊");
   } else if ($uid == -6) {
    System.out.print("該 Email 已經(jīng)被注冊");
   } else {
    System.out.print("未定義");
   }
  } else {
   System.out.println("OK:" + $returns);
  }

登錄部分代碼

Client e = new Client(); String result = e.uc_user_login("username", "password");
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) {
System.out.println("登錄成功"); System.out.println($username); System.out.println($password); System.out.println($email);
String $ucsynlogin = e.uc_user_synlogin($uid); System.out.println("登錄成功"+$ucsynlogin);
//本地登陸代碼 //TODO ... ....
} else if($uid == -1) {
System.out.println("用戶不存在,或者被刪除");
} else if($uid == -2) {
System.out.println("密碼錯");
} else {
System.out.println("未定義");
}
}else{
System.out.println("Login failed"); System.out.println(result);
}

$ucsynlogin 這里著重注意下這里,在你的action或者servlet類中得到調(diào)用接口返回的該字符串值,

<script type="text/javascript" src="http://192.168.1.109/bbs/api/uc.php?time=1295926163&code=c8d08KSlEZlDk4tTsjChzRYzZp2EpUierc%2FS3NLnFUviig8HvTnDNymm080JxI8Byl%2F1TW%2FveKQRlR14Io9pvR9eMD1F%2FAH3l1tuzWt3Rw9MQLrK5Lz0q8eMn5%2BAae92YBwwNlWiFWHyfyh%2FzUNC%2FA3HFnEgdX%2F61IwV" reload="1"></script><script type="text/javascript" src="http://www.***.com/api/uc.php?time=1295926163&code=8a5b92lMQgq2AOw7mnIr3hlDJz5NGbKYnePP7987khS40SJquzXL2BYDiBSrTVYGb5XkZw18tc0w4ICeueEL91lLCqC7gMFopnhecbXtMZekpb0%2FRcb7P0eLWmNhlCKF5yb6zbBuT4SyAs8eJ9rBwasUCcohh5Ch475M" reload="1"></script>

這段是要輸出到頁面的,一定!其實原理就是相當(dāng)于讓瀏覽器去訪問下自己應(yīng)用與另外一個應(yīng)用,分別同步下雙方的cookie等操作。

res.setContentType("text/html");
  res.setCharacterEncoding("utf-8");
                res.getWriter().write("成功登陸論壇" + $ucsynlogin);

登出部分代碼

//登出同步
  Client uc = new Client();
  //setcookie('Example_auth', '', -86400);
  //生成同步退出的代碼
  String $ucsynlogout = uc.uc_user_synlogout(); System.out.println("退出成功"+$ucsynlogout);
  
  if ($ucsynlogout != null) {
   HttpServletResponse res = getResponse();
   System.out.println($ucsynlogout);
   res.reset();
   
   res.setContentType("text/html");
   res.setCharacterEncoding("utf-8");
   res.getWriter().write("成功登出" + $ucsynlogout);

   return null;
  }

基本上,就是如上面那些步驟咯。還是比較簡單的。


關(guān)鍵詞:JavaDiscuzUcenter

贊助商鏈接: