分享

java整合discuz单点登录 | 邹颢的博客

 WindySky 2016-08-03

java里没有好的论坛,唯一好的大概就是jsprun,这个是仿discuz论坛,不过貌似团队不做了,也停止了更新了

最近项目里需要一个论坛,碰巧我以前是做php的,对于discuz ucenter以前也做过单点登录,于是开始把discuz整合进项目中.

首先先安装ucenter,与discuz整合,如果不知道ucenter是什么?请自行百度.

现在的discuz项目直接下载下来在安装的时候会让你选择是否整合进ucenter,选择是就行了,如果是已经的论坛请自行整合进ucenter.

java项目中有人已经编写了discuz-ucenter-for-java.我们用这个插件就可以实现java与php的对接的

先去https://code.google.com/p/discuz-ucenter-api-for-java/downloads/list下载discuz-api-for-java..

本人的环境:

apache-php :80端口

java:8080端口

网上也可以把php整合进tomcat,让php和java都用同一个端口,具体方法我就不讲述

我这里php和java分别用的是2个端口

工具都差不多了.下面开始步骤了.

1:进入ucenter后台.ucenter->应用管理->添加新应用

1
2:填写应用名称,应用的主url,通讯密钥,勾上开启同步登陆.,其他的都可以不填.创建好后,记录应用ID
3:将discuz-ucenter-api-for-java加入到项目中,配置web.xml
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- discuz论坛ucenter整合 -->
<servlet>
<servlet-name>
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>
api
</servlet-name>
<url-pattern>
/api/uc.php
</url-pattern>
</servlet-mapping>
<!-- discuz论坛ucenter整合 -->

4:配置config.properties
PHP
1
2
3
4
5
UC_API = http://localhost/discuz/uc_server
UC_IP =
UC_KEY =x2ydu036Ubtf55gfyf2bR7Mc62v2a7J7rcrdA9Ncx259B323wegb87P5l7CaYd34
UC_APPID = 2
UC_CONNECT =

UC_API就是ucenter的路径

UC_IP可以不填,会自动根据域名解析该IP

UC_KEY就是通讯密钥

UC_APPID就是ucenter添加应用的ID

配好就可以,通讯就应该成功了.

如果不成功,请添加ip.还有注意config.properties的路径,我是自己修改了名字和路径..修改路径的话记得去Client.java里修改路径,因为它这里会读取config.properties

接下来就是关于discuz-api-for-java的一些api

1:同步注册

Java
1
2
3
4
5
6
7
8
9
10
11
Client discuzClient = new Client();
discuzClient.uc_user_register("zhangsan","password","zouhao619@gmail.com");
/**
-1 : 用户名不合法
-2 : 包含不允许注册的词语
-3 : 用户名已经存在
-4 : email 格式有误
-5 : email 不允许注册
-6 : 该 email 已经被注册
>1 : 表示成功,数值为 UID
*/

2:同步登陆

Java
1
2
3
4
5
6
Client discuzClient = new Client();
String loginResult = discuzClient.uc_user_login("zhangsan","password");//根据账户密码获取用户相关信息
LinkedList<String> userInfo=XMLHelper.uc_unserialize(loginResult);
uid=Integer.valueOf(userInfo.get(0));//获取用户的ID
String $ucsynlogin = discuzClient.uc_user_synlogin(uid);//根据ID进行同步登陆
response.getWriter().print($ucsynlogin);//把$ucsynlogin输出到页面上就行了.这样就实现了同步登陆,实际上就是一个script标签可以进行跨域的功能

注意事项:

1:ucenter->注册设置->是否允许同一个email注册多个用户根据自己的实际情况来决定

2:同步注册后,需要到discuz登录一次,才能实现同步登录.如果进行同步注册后,账户没有登录,那么也无法实现同步登录,如果你要实现同步注册后,就能登录.就修改uc_server/model/user.php第129行左右的add_user($username, $password, $email, $uid = 0, $questionid = ”, $answer = ”, $regip = ”)方法

修改为如下内容:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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'");
  
//begin
$this->db->query("INSERT INTO `discuz`.dz_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 INTO `discuz`.dz_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 INTO `discuz`.dz_common_member_profile SET uid='$uid'");
$this->db->query("INSERT INTO `discuz`.dz_common_member_field_forum SET uid='$uid'");
$this->db->query("INSERT INTO `discuz`.dz_common_member_field_home SET uid='$uid'");
$this->db->query("INSERT INTO `discuz`.dz_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");
//end
return $uid;
}

在添加到ucenter的同时添加到discuz表中.

3:如果你要实现同步登录,在页面输出discuzClient.uc_user_synlogin(uid),他其实是一段script,用来跨域访问的.但是有可能由于网络原因,你还没有发出这个请求,你就先跳转页面了.所以造成无法同步登录.

我用的方法是,用jquery.$.script()方法来加载这个js,由于是跨域,$.script()无法有返回,这个时候需要在php服务器端设置

PHP
1
header("Access-Control-Allow-Origin:*"); //允许任何访问(包括ajax跨域)

详细代码如下:

JavaScript
1
2
3
4
5
6
7
<script>
$(function(){
$.getScript('script的目标url', function(){
location.href='bbs路径';
});
});
</script>

确定执行完了这个js同步登录后,在执行location进行跳转

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多