Discuz论坛整合web项目

时间:2022-10-22 00:22:40

通过查阅一些资料和自己项目中的实际操作来写

一.准备工作

访问UCenter控制台,添加新应用,其中

安装方式:自定义

应用类型:其他

应用名称:JAVA项目名称,可随意

应用主URLJAVA项目的访问地址,例如:http://localhost:8080/javaTest

通信密钥:任意字符,例如:123456

应用接口文件名称:uc.php,这个不要改,前面也不要加/api/UCenter在与其通信时会自动转换为:http://localhost:8080/javaTest/api/uc.php

是否开启同步登录:是

是否接受通知:是

以上的配置项必填,其他保持为空即可

点击提交,保存成功后,记下该JAVA应用的APPID,下面的配置中会需要。

此时返回应用列表,UCenter会自动进行通信验证,不出意外肯定会出现通信失败的字样,先不必管它

应用项目配置

1.  将文件中对应代码覆盖到咱们需集成的系统中

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中的代码如下:


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中的代码如下:

<?xmlversion="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的控制台,点击应用管理,此时应该会看到绿色的“通信成功”字样

让JAVA项目与Discuz!进行会话状态同步

1.在JAVA项目中,用户登录成功之后,需要执行以下代码:

       Client uc = new Client();
        String $ucsynlogin =uc.uc_user_synlogin($uid);
        out.println($ucsynlogin);

其中的$ucsynlogin其实是一段JavaScript代码,这段代码是从UCenter返回的

目的就是向已经在UCenter中注册的应用发送状态同步请求,保持会话状态一致性

所以,就要保证$ucsynlogin中的JS代码必须输出到浏览器,并且成功执行

2.Discuz!中登录、退出,同步到JAVA项目

首先,要注意一个配置选项,位于Discuz!管理控制台的:站长 - UCenter设置中

UCenter 连接方式:必须选择接口方式,如果选择数据库方式,则不会向其他应用发送同步请求

然后,在我们JAVA项目中,作为与UCenter对话的窗口,src/api/ucenter/UC.java就会负责接收其他应用通过UCenter发送过来的会话状态同步请求

其中的$action.equals("synlogin")为登录同步,修改其中对Cookie的赋值代码,实现本地系统的会话也保持登录状态

其中的$action.equals("synlogout")为登出同步,同样,修改代码,实现本地的登出同步。

注意其中的一行代码:

response.addHeader("P3P","CP=\"CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR\"");

意思是要求浏览器对当前的Cookie操作宽容对待,如果涉及跨域操作也不要阻止。所以,这行代码原样保留,可以使状态同步更加稳定。

 

二.河北集客修改部分说明

1.     新加入包和类(此为Discuz接口)

论坛种转控制类

 论坛中转jsp

2.     修改部分

在web.xml中修改部分(论坛通信所用)

在SecurityAuthcFilter中修改部分 因为只有在这里才能拿到原始的用户名和密码

处理论坛登录信息:

public String  loginForum(String username,String password)

   {

     

      Client uc = new Client();

     

       String result =uc.uc_user_login(username, password);

       LinkedList<String> rs =uc_unserialize(result);

       String $ucsynlogin="";

       if(rs.size()>0){

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

           if($uid > 0) {

              

               $ucsynlogin =uc.uc_user_synlogin($uid);

           } else if($uid == -1) {

              logger.info(username +":用户名不存在,或者被删除" );

           } else if($uid == -2) {

             logger.info(username +":登录论坛密码错误" );

           } else {

             logger.info(username +":未定义" );

           }

       }else{

           System.out.println(result);

       }

       return $ucsynlogin;

   }

解析返回xml信息

public  LinkedList<String>uc_unserialize(String input){

     

      LinkedList<String> result = new LinkedList<String>();

     

      DOMParser parser = new DOMParser();

      try {      

         parser.parse(new InputSource(new StringReader(input)));

         Document doc = parser.getDocument();

         NodeList nl = doc.getChildNodes().item(0).getChildNodes();

         int length = nl.getLength();

         for(int i=0;i<length;i++){

            if(nl.item(i).getNodeType()==Document.ELEMENT_NODE)

                result.add(nl.item(i).getTextContent());

         }

      } catch (SAXException e) {

         e.printStackTrace();

      } catch (IOException e) {

         e.printStackTrace();

      }

      return result;

   }

在原有基础上修改部分:

上面session是在accessforum-index.jsp中用到的

 三 以上配置完成之后基本上就已经可以正常访问了 不过这里 我们通过web项目进行注册时,需要先激活一次才能 正常登录,下面是解决方案(通过查阅网上资料)

通过修改下面的内容

(1)    Upload/uc_server/model/user.phpàadd_user

 

    function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {

       $regip = empty($regip) ? $this->base->onlineip : $regip;

       $salt = substr(uniqid(rand()), -6);

       $password = md5(md5($password).$salt);

       $sqladd = $uid ? "uid='".intval($uid)."',": '';

       $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid,$answer)."'," : " secques='',";

       $this->db->query("INSERT INTO".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");

       $uid = $this->db->insert_id();

       $this->db->query("INSERT INTO".UC_DBTABLEPRE."memberfields SET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0',timeoffset='9999'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."',lastactivity='".$this->base->time."',lastpost='0', lastsendmail='0'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_profile SET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_field_forum SET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_field_home SET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0',extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0',extcredits7='0', extcredits8='0'");

      

       return $uid;

    }

 

(2)     Upload/uc_client/model/user.php-àadd_user

   function add_user($username,$password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {

       $regip = empty($regip) ? $this->base->onlineip : $regip;

       $salt = substr(uniqid(rand()), -6);

       $password = md5(md5($password).$salt);

       $sqladd = $uid ? "uid='".intval($uid)."',": '';

       $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid,$answer)."'," : " secques='',";

       $this->db->query("INSERT INTO".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");

       $uid = $this->db->insert_id();

       $this->db->query("INSERT INTO".UC_DBTABLEPRE."memberfields SET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."',credits='0', timeoffset='9999'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."',lastactivity='".$this->base->time."',lastpost='0', lastsendmail='0'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_profile SET uid='$uid'");

        $this->db->query("INSERT INTO discuz.zyb_common_member_field_forumSET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_field_home SET uid='$uid'");

       $this->db->query("INSERT INTOdiscuz.zyb_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0',extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0',extcredits7='0', extcredits8='0'");

       return $uid;

}

 

Class_member.php 如果上面两种情况不可以再进行更改

//begin

          

           //判断是否登陆成功(登陆成功会返回:用户id、用户名、密码等信息):

           $user_t=uc_user_login($result["ucresult"]["username"],$result["ucresult"]["password"]);

           //查询论坛中是否存在该账号

           $user_inf = DB::fetch_first("SELECT * FROM".DB::table('common_member')." WHERE uid=".$uid);

           //如果该账号不存在论坛用户表中且登陆成功,则将该用户的信息写入论坛用户数据中(即实现不用点击激活才能使用的缺陷)。

           if(!$user_inf["uid"] AND $user_t[0]>0){

           DB::insert('common_member', array(

           'uid' => $uid,

           'username' => $result['ucresult']['username'],

           'password' => md5(random(10)),

           'email' => $result['ucresult']['email'],

           'adminid' => 0,

           'groupid' =>$this->setting['regverify'] ? 8 : $this->setting['newusergroupid'],

           'regdate' => TIMESTAMP,

           'credits' => $init_arr[0],

           'timeoffset' => 9999

           ));

           DB::insert('common_member_status', array(

           'uid' => $uid,

           'regip' => $_G['clientip'],

           'lastip' => $_G['clientip'],

           'lastvisit' => TIMESTAMP,

           'lastactivity' => TIMESTAMP,

           'lastpost' => 0,

           'lastsendmail' => 0

           ));

           DB::insert('common_member_profile', array('uid' =>$uid));

           DB::insert('common_member_field_forum', array('uid' =>$uid));

           DB::insert('common_member_field_home', array('uid' =>$uid));

           DB::insert('common_member_count', array(

           'uid' => $uid,

           'extcredits1' => $init_arr[1],

           'extcredits2' => $init_arr[2],

           'extcredits3' => $init_arr[3],

           'extcredits4' => $init_arr[4],

           'extcredits5' => $init_arr[5],

           'extcredits6' => $init_arr[6],

           'extcredits7' => $init_arr[7],

           'extcredits8' => $init_arr[8]

           ));

           manyoulog('user', $uid, 'add');

           $result['member'] = DB::fetch_first("SELECT * FROM".DB::table('common_member')." WHERE uid='$uid'");

           $result['status'] = 1;

           }

        //end