服务器要支持php语言+支持mysql 5.0以上的数据库 + Apache服务器(支持网站的一个服务器,经过域名的能访问就能够了)php
Msql5.0以上的数据库一个。html
(1)下载Discuz源码包 http://www.discuz.net/thread-3570835-1-1.htmljava
(2)解压源码包Discuz_X3.2_SC_GBK.zip(这里以Discuz X3/2为例)有三个文件,把 其中的upload文件夹里面的内容放在网站的根目录下。mysql
注意:web
是upload文件夹下面的全部内容放入网站根目录下,若是把upload整个文件夹放在网站根目录访问的地址就是 http://localhost/upload )sql
(3)访问域名地址就开始安装如图:参考地址:数据库
http://jingyan.baidu.com/article/ac6a9a5ea76e022b653eacca.htmlapi
配置数据库信息:服务器
提早建立好mysql数据库,用户/密码,这里进行配置。同时给设置一个管理员帐号和密码:点击下一步cookie
注意:必定是mysql 5.0以上的数据库版本
若是没有问题的话就安装成功了。它会自动建立对应的数据库表等相关信息。
而后访问域名就直接能够访问论坛了。
若是是管理员的话会有一些管理信息
若是是管理员浏览帖子的话,会有“置顶”,“精华”,“明亮”等操做,如图:
具体还有不少,这里不一一介绍。
管理中心,就是进入后台管理的入口。主要是网站的风格,和布局
管理中心后台有不少功能,首先须要设置的是论坛大体板块,以下图:
对应的前台以下图:
我理解的时间也有限,具体设置还须要多进行操做,这里不进行逐个说明。
Discuz和java对接须要一个中间件,它就是Ucenter。Comsenz(康盛)的UCenter当前在国内的单点登陆领域占据绝对份额,其完整的产品线令UCenter成为了帐号集成方面事实上的标准。基于UCenter,能够将Comsenz旗下的Discuz!(社区论坛系统)、SupeSite(门户CMS系统)、X-Space(博客系统)从用户资源层面进行无缝整合,使得帐号实现统一管理,在任何一个系统中进行注册、登陆、注销等操做时,该帐号在其余系统中的会话状态也将同步更新,最终实现一号通的单点登陆模式。
使用ucenter进行同步操做,主要依托于ucenter server 和ucenter client之间的api接口进行通信。要使得通信成为可能,首先要经过ucenter管理所用应用(经过配置使得当前应用和ucenter产生联系,也就是通信成功)。其余应用经过挂接到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创建通道的时候会详细说明怎么创建通道,创建通讯通道的方式都是同样的。
登陆成功以后
应用管理》添加应用
标红的为主要填写的。其余的能够不填写。
安装方式:自定义
应用类型:其余
应用名称:JAVA项目名称,可随意
应用主URL:JAVA项目的访问地址,例如:http://localhost:8080/javaTest
通讯密钥:任意字符,例如:123456
应用接口文件名称: uc.php ,这个不要改,前面也不要加/api/,UCenter在与其通讯时会自动转换为: http://localhost:8080/javaTest/api/uc.php
是否开启同步登陆:是
是否接受通知:是
以上的配置项必填,其余保持为空便可 。
点击“提交”,保存成功后, 记下该 JAVA 应用的 APPID ,下面的配置中会须要。
此时返回应用列表,UCenter会自动进行通讯验证,不出意外确定会出现“ 通讯失败”的字样,先没必要管它
由于java端也须要一些配置
一、从“ discuz-ucenter-api-for-java ”的开源项目网站中下载相关的API文件,也能够从这里下载:JAVA_UCenter.zip
这里给一个比较好的下载地址,包括源码,及jar包文件:
http://code.google.com/p/discuz-ucenter-api-for-java
二、将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>
三、JAVA端配置完成,在eclipse中启动调试模式
四、再次返回到UCenter的控制台,点击应用管理,此时应该会看到绿色的“ 通讯成功 ”字样
到这里Discuz和Ucenter之间的通讯通道与java和Ucenter之间的通讯通道都已经创建成功,下面就能够在2.3.4看具体如何开发
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("添加失败!");
}
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);
1> 步骤说明:
java网站网站注销 > 调用Client里面的uc_user_synlogout同时注销论坛用户
2> 具体代码实现(仅供参考)
Client uc = new Client();
String $ucsynlogout = uc.uc_user_synlogout();
System.out.println("退出成功"+$ucsynlogout);
return $ucsynlogout;
1> 步骤说明:
修改用户保存 > 获取以前论坛用户信息 > 调用接口进行修改uc_user_edit
2> 具体代码实现(仅供参考)
Client uc = new Client();
uc.uc_user_edit($username, $oldpw, $newpw, $email, $ignoreoldpw, $questionid, $answer)
主要代码片断
咱们来看看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();
|
这样还不行,解密出来的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,其余状况本身改一下编码应该没问题。
参考资料 http://my.oschina.net/u/1274710/blog/165570
参考资料 http://www.cnblogs.com/netWild/archive/2013/06/28/3161164.html