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->应用管理->添加新应用
2:填写应用名称,应用的主url,通讯密钥,勾上开启同步登陆.,其他的都可以不填.创建好后,记录应用ID
3:将discuz-ucenter-api-for-java加入到项目中,配置web.xml
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
|
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:同步注册
|
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:同步登陆
|
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 = ”)方法
修改为如下内容:
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服务器端设置
|
header("Access-Control-Allow-Origin:*"); //允许任何访问(包括ajax跨域) |
详细代码如下:
|
<script> $(function(){ $.getScript('script的目标url', function(){ location.href='bbs路径'; }); }); </script> |
确定执行完了这个js同步登录后,在执行location进行跳转
|