最完美的Discuz UCenter的JAVA API接口,简单易用,完全免费!
相关博文:https://www.renfei.net/posts/1003429
社区论坛:https://bbs.renfei.net/forum-44-1.html
此项目移植自https://code.google.com/archive/p/discuz-ucenter-api-for-java / https://github.com/liangping/dzclient4j,感谢原作者梁平 ([email protected])将他的代码开源。
由于原有项目已经非常古老了,看时间应该是2009年的产物,但现在的项目都使用Maven
和SpringBoot
进行构建,里面直接配置servlet
的方式不太适合现代项目集成,我就拿来进行了一些修改,让使用Maven
和SpringBoot
的程序更容易集成进去。
GPLv2具有很强的传染性,选用这个开源协议并不是我定的,而是原项目作者在开源时就选用了 GPLv2,我也只能跟随原开源协议继续传染下去。
当然,如果您并不注重什么版权协议,那可以无视。
也许您注意到源程序的程序包名由com.fivestars
被我改为了net.renfei.discuz.ucenter
,这是因为要发布到Maven中央仓库,在注册Maven中央仓库的时候会要求验证域名所有权,并且数字签名,所以我只能发布net.renfei
的库,为了在项目中不产生混淆,我就直接将源码中的包名也一起统一修改了。
您的项目环境需要是JDK1.8
以上。其中Base64
使用了Java8
自带的库实现,移除了原作者自己写的Base64
算法。同时我的编译环境也是在Java8
中编译发布的。
我使用的是Maven
和SpringBoot
进行演示。在pom.xml
文件中添加依赖:
<dependency>
<groupId>net.renfei</groupId>
<artifactId>discuz-ucenter-api-for-java</artifactId>
<version>1.0.7</version>
</dependency>
如果你使用的是传统方式,需要下载Jar
包,放入lib
文件夹,下载地址:discuz-ucenter-api-for-java-1.0.7.jar
为了跟SpringBoot
更好的集成,我对原项目进行了修改,原项目是修改配置文件,我修改为了实例化时传递参数的方式
如果你的站点是https
的,必须使用版本号1.0.6
及以上,旧版本的作者没有考虑https
,我修改了代码兼容了https
。
实例化一个客户端net.renfei.discuz.ucenter.client.Client
,参数依次是:UCenter接口地址、IP地址、通讯Key、APPID、Connect。
Client client = new Client("http://localhost/uc_server", null, "key", "2","");
旧的源代码中是通过配置文件注册一个servlet
,我改造的是用于SpringBoot
项目的,所以通过配置文件注册servlet
不是很方便,而且为了尽量降低代码入侵性,我就改为自己使用Controller
处理HttpServletRequest
和HttpServletResponse
的方式。
先创建一个Controller
,然后创建一个处理HttpServletRequest
和HttpServletResponse
的方法,给一个UCenter
请求的地址@RequestMapping("/api/uc.php")
,实例化一个客户端net.renfei.discuz.ucenter.api.UCClient
和net.renfei.discuz.ucenter.client.Client
,然后把HttpServletRequest
交给net.renfei.discuz.ucenter.api.UCClient.doAnswer()
去处理,最后将结果写入HttpServletResponse
,如果UCenter
配置正确,就应该可以在UCenter
看到通讯正常了。具体使用如下案例:
@Controller
public class UCenterController {
@ResponseBody
@RequestMapping("/api/uc.php")
public void uc(HttpServletRequest request, HttpServletResponse response) throws IOException {
UCClient ucClient = new UCClient();
Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String result = ucClient.doAnswer(client, request, response);
response.getWriter().print(result);
}
}
如果您想自己处理一些动作的逻辑,只需要继承net.renfei.discuz.ucenter.api.UCClient
然后重写覆盖里面的doAnswer(Client client, HttpServletRequest request, HttpServletResponse response)
方法即可。
Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String string = client.ucUserRegister("username","password","email");
Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String string = client.ucUserLogin("username","password");
Client client = new Client("http://localhost/uc_server", null, "key", "2","");
int UID = 21; //此处是用户的UID
String string = client.ucUserSynlogin(uid);
Client client = new Client("http://localhost/uc_server", null, "key", "2","");
// 登陆
String result = client.ucUserLogin(uid);
LinkedList<String> rs = XMLHelper.ucUnserialize(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) {
//同步登陆
String string = client.ucUserSynlogin(uid);
//本地登陆代码
//TODO ... ....
} else if(uid == -1) {
System.out.println("用户不存在,或者被删除");
} else if(uid == -2) {
System.out.println("密码错");
} else {
System.out.println("未定义");
}
}else{
System.out.println("Login failed");
System.out.println(result);
}
在网友使用中出现问题,和我们一起讨论交流的结果将在 https://www.renfei.net/posts/1003429 文章末尾常见问题中更新补充。
- [Main] Github:https://github.com/renfei/discuz-ucenter-api-for-java
- [Mirror] Gitlab:https://gitlab.com/renfei/discuz-ucenter-api-for-java
- [Mirror] Gitee:https://gitee.com/rnf/discuz-ucenter-api-for-java
- [Mirror] Coding:https://githubi.coding.net/public/renfei/discuz-ucenter-api-for-java/git/files
更多信息请阅读源代码,此处不再一一演示。您可以提出issues或者到我的社区论坛一起讨论:https://bbs.renfei.net/forum-44-1.html
如果这个项目帮助到了你,是否能给我点个免费的星星 (Star) 给个鼓励呢。高星项目我将持续关注努力更新的。