java(jsp)整合discuz同步登录功能详解

来源:互联网 发布:linux vi 编辑模式 编辑:程序博客网 时间:2024/06/05 02:23

java(jsp)整合discuz同步登录功能详解

Jsp整合discuz同步登录功能详解,Uenter是Comsenz旗下各个产品之间信息直接传递的一个桥梁,通过UCenter站长可以无缝整合Comsenz系列产品,Center拥有机制完善的接口,经过简单修改便可以挂接其它任何平台的第三方的网络应用程序


最近做了资源库系统的项目,老师说可以搭建开源论坛替代自己开发社交模块,正好在开源中国上看到了一个利用discuz的UCenter功能实现同步登录的开源项目(https://code.google.com/p/discuz-ucenter-api-for-java/),不禁大喜,于是花了几个小时照着教程操作了一遍,居然很轻松的成功了,特写此文以做纪念。。

Uenter是Comsenz旗下各个产品之间信息直接传递的一个桥梁,通过UCenter站长可以无缝整合Comsenz系列产品,实现用户的一站式注册、登录、退出。UCenter可以让Comsenz旗下所有产品联系地更加紧密,实现用户的统一注册登录,让社区真正运转起来。 UCenter拥有机制完善的接口,经过简单修改便可以挂接其它任何平台的第三方的网络应用程序。UCenter作为信息传统桥梁,拥有统一的短信息、好友机制,最终用户可以通过它轻松通行在各个应用之中,无需重复登录、注册、退出。统一的标签(TAG)机制,将社区中各个应用紧密连接,用户可以在社区里面进行自由穿梭,快速找到所需的应用,获得最佳的使用体验。

首先,第一步,安装好apache和ph

我的版本为php-5.4.23-Win32-VC9-x86和httpd-2.2.25-win32-x86-openssl-0.9.8y


基本上没有遇到什么特别的问题,除了因为php和apache的版本不配套耽误了点时间,其余基本顺利。

如果php里面是2_4,则需要下载一个低版本的php,否则会导致apache服务器无法正常解析php文件。

第二步,安装discuz,我安装的版本是Discuz_X3.1_SC_UTF8.zip。安装的时候勾选全新安装会顺便安装UCenter,如果没有安装的话就需要自己下载安装了,版本为UCenter1.5+

第三步,开始配置UCenter服务器端(就是UCenter安装的那个程序)

如图:


 

第三步,配置我们自己的程序,也就是客户端。

1.拷贝开源项目里的jar包https://code.google.com/p/discuz-ucenter-api-for-java/downloads/list

2.配置一个用于与UCenter对接的servlet

复制代码 代码如下:

<servlet>
        <servlet-name>connect_discuz</servlet-name>
        <servlet-class>com.fivestars.interfaces.bbs.api.UC</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>connect_discuz</servlet-name>
        <url-pattern>/api/uc.php</url-pattern>
</servlet-mapping> 

3.把配置文件(config.properties)复制到src目录下

复制代码 代码如下:

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

#
#uc server url如果是全新安装的模式,ucenter可以随discuz一起安装,路径是
UC_API = http://{discuz根目录}/uc_server
#uc ip address
UC_IP = 127.0.0.1

#key
UC_KEY = yunstudio

#appid
UC_APPID = 2

#connect mode: default value is ""
UC_CONNECT =

4.把开源项目中的demo(Jsp_demo.jsp)复制到应用的根目录中。原来作者的jsp文件编码和文件头都有点小问题,所以我稍微的修改了一下。

复制代码 代码如下:

<%
/**
 * ================================================
 * Discuz! Ucenter API for JAVA
 * ================================================
 * JSP 调用示例
 *
 * 更多信息:http://code.google.com/p/discuz-ucenter-api-for-java/

 */
%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.fivestars.interfaces.bbs.util.XMLHelper"%>
<%@ page import="com.fivestars.interfaces.bbs.client.Client"%>
<%
Client uc = new Client();
String result = uc.uc_user_login("admin", "yun");

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) {
        response.addHeader("P3P"," CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");

        out.println("登录成功");
        out.println($username);
        out.println($password);
        out.println($email);

        String $ucsynlogin = uc.uc_user_synlogin($uid);
        out.println("登录成功"+$ucsynlogin);

        //本地登陆代码
        //TODO ... ....

        Cookie auth = new Cookie("auth", uc.uc_authcode($password+"\t"+$uid, "ENCODE"));
        auth.setMaxAge(31536000);
        //auth.setDomain("localhost");
        response.addCookie(auth);

        Cookie user = new Cookie("uchome_loginuser", $username);
        response.addCookie(user);

    } else if($uid == -1) {
        out.println("用户不存在,或者被删除");
    } else if($uid == -2) {
        out.println("密码错");
    } else {
        out.println("未定义");
    }
}else{
    out.println("Login failed");
    System.out.println(result);
}
%>

如果例子能运行起来,那么注册登出什么的就可以直接看官网上的代码看懂了,很简单的。



一 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(); 

   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,其他情况自己改一下编码应该没问题。


一 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(); 

   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,其他情况自己改一下编码应该没问题。

阅读全文
0 0
原创粉丝点击