java整合discuz小結(實現與論壇同步登陸等操做)

        最近筆者在實現java項目對discuz的整合。在此過程當中,查了不少這方面的資料,發現網上並無說得比較全面的文章。筆者博取衆長以及本身在此過程當中遇到的問題,寫下來供你們參考,但願你們能夠在這過程當中少走彎路。筆者在此過程當中主要參考了https://code.google.com/p/discuz-ucenter-api-for-java/後,感謝做者ping china.你們能夠到此下載接口。 php

        第一步:寫好你的配置文件config.properties。      java

        UC_API = http://你的discuz地址/uc_server  如http://localhost/forum/uc_server
        UC_IP = 正常狀況下留空便可
        UC_KEY = 123456(與ucenter通訊的密鑰,這裏本身設定,需與discuz ucenter一支)
        UC_APPID = 2
        UC_CONNECT = 正常狀況下留空便可
web

        第二步:在你的web.xml里加上         api

<!-- servlet 'disuz_uc_api' 用於接收Discuz UCenter的同步消息, 此項配置必須有。(可適當調整 load-on-startup參數) -->
        <servlet>
            <servlet-name>disuz_uc_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>disuz_uc_api</servlet-name>
            <url-pattern>/api/uc.php</url-pattern>
        </servlet-mapping>

         

        第三步:配置ucenter. 瀏覽器

        以管理員身份登陸-》管理中心-》ucenter-》應用管理。 安全

        填寫如下信息:應用名稱:你的應用的名稱 app

        通訊密鑰:你剛在config.properties的UC_KEY (123456) 測試

        是否開啓同步登陸:是 ui

        是否接受通知:是 google

        其餘的留空便可。

        而後咱們先試一下登陸,如下是測試代碼。(到這裏還不支持中文,後面會提到)

        

public static String login(String userName,String pwd){ 
       Client e = new Client();
       String result = e.uc_user_login(userName, pwd);
       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 = e.uc_user_synlogin($uid); 
            } 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);
        }
        return $ucsynlogin;
    }

    建一個測試類,把這個方法加進去,而後調用此方法,傳參數值用戶名和密碼,而後返回的是一個string。string的內容是一段js代碼。只要把這段js代碼輸出到頁面上去就實現了discuz那邊的登陸了。你能夠先試試把這段js輸入到瀏覽器的地址欄。

    退出測試代碼:

      

        public static String logout(){
            Client uc = new Client();
            String $ucsynlogout = uc.uc_user_synlogout();
            System.out.println("退出成功"+$ucsynlogout);
            return $ucsynlogout;
        }

    此方法也是返回一段js。輸出頁面便可,測試時能夠先在瀏覽器地址欄輸入。

    註冊測試代碼:

     

public static void reg(String userName, String password, String email) {
       Client uc = new Client();
       String $returns = uc.uc_user_register(userName, password ,email);
       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("未定義");
            }
        } else {
            System.out.println("OK:------------------------"+$returns);
        }
    }

到這裏,還只是實現了java項目登陸後論壇那邊能自動登陸,但論壇那邊登陸了,java這邊還沒登陸。別急,咱們先解決一下中文用戶名的問題,其實這個問題https://code.google.com/p/discuz-ucenter-api-for-java/裏已經提到了,並提供瞭解決方案。感謝原做者。但我仍是囉嗦一下,由於我感受說的不夠詳細,你們可能要花去你的寶貴時間去了解。解決方法以下:

        在PHPFuctions.java裏有一個名叫urlencode的方法。

        只要用如下方法重載一下就好        

    protected String urlencode(String value,String code){
            try {
                return URLEncoder.encode(value,code);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                return null;
        }

        並把Client.java裏的uc_api_input方法改爲以下     

public String uc_api_input(String $data) {
 String $s = urlencode(uc_authcode($data+"&agent="+md5("")+"&time="+time(), "ENCODE"            , UC_KEY),"GBK");
     return $s;
}

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

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,其餘狀況本身改一下編碼應該沒問題。

        至此,只要咱們在doAnswer()方法裏添加咱們本身的邏輯代碼就已經能實現java和discuz的同步了。另外,有個問題提醒你們,就是在discuz那邊修改密碼的時候,ucenter並非立刻發出通知的,這可能會引發同步和安全的問題。

        可能有地方寫漏了!!若有相關問題須要瞭解可留言  

相關文章
相關標籤/搜索