Java服务整合UCenter,实现用户状态双向同步

原理:在某应用登录后,需要向UC发送同步登录请求,成功后UC会返回一段js代码,其中主要是一个http地址。这个地址指向了非当前登录的应用,请求这个地址之后,非当前登录的应用就有了登录记录。实际上,相当于通过这段代码在别的应用上进行了一次登录,这是用户看不见的,个人感觉严格来说并不算是单点登录,而且这个单点登录有一个缺点,针对php,jsp,asp这些语言很好用,但是html就不行,因为html没有处理请求的能力,后面我会详细说说。

  1. 整合配置UCenter
    1. java服务集成uc库

先去https://code.google.com/archive/p/discuz-ucenter-api-for-java/downloads下载需要用到的库(下载需要翻墙,我放百度盘了,结尾有下载链接,****必须要积分,太坑了。另外不用联系他们了,根本没人回,这代码很久没更新了,你能找到的关于discuz和UCenter的博客,大多数都是好几年前的了),可以选择jar包,也可以下载源码,我下载的是源码,可以方便地进行修改。其中一共包含5个java文件,如果是jar包会有一个config文件,如下图:

Java服务整合UCenter,实现用户状态双向同步

Base64.java、PHPFunctions.java、XMLHelper.java这三个类都是工具类,不需要操作,Client.java主要负责向UC发送请求,UC.java负责接收UC发出的同步通知。

接下来进行相关配置,只需要配置Client.java就行,主要配置UC_API、UC_KEY、UC_APPID。

UC_KEY是在UC中心配置的**,下面会配置;UC_APPID也是UC中心的数据,是应用id;【重点】UC_API是discuz的目录,必须配置上“uc_server”,很多博客上都没有,如果没有会请求失败。

Java服务整合UCenter,实现用户状态双向同步

 

  1. discuz服务添加应用

登录UCenter,在中心添加应用,需要配置以下信息,类型,名称,URL,**,IP可不配,但可能会导致通信失败。记得选上开启同步登录和接收通知,然后提交。在url后面最好加上端口号,否则可能会失败。

Java服务整合UCenter,实现用户状态双向同步

开启java服务,正常情况下,会通信成功。

Java服务整合UCenter,实现用户状态双向同步

这里的通信是由UC向java服务的UC.java发送了请求,可以通过断点在UC.java中捕捉到,参数中action=test。

Java服务整合UCenter,实现用户状态双向同步

第一步工作完成。

2、后台获取UC通知

1、discuz向java请求同步

这一步需要在php里面进行配置,找到uc_client/data/cache/apps.php,第一个应该是不需要配置的,主要是第二个,和UC中心配置一样,主要是apifilename,这关系到UC返回的js里的http的路径,如:http://127.0.0.1:8080/api/test?code=value&time=value。用户的action、username、加密password、time都在code里面。

Java服务整合UCenter,实现用户状态双向同步

到这里还不一定能收到同步通知,如果收不到,检查一下php代码,source/class/class_member.php文件的on_login()方法,大概在140行左右,有这样一行代码:

Java服务整合UCenter,实现用户状态双向同步

可以直接把这里写死,不需要判断,因为我没找到这个setting在哪里,不是在这个类定义的array,也不是继承过来的属性。

这样应该可以在UC.java里捕捉到UC发出的同步请求,这个请求里也带有code,后台可以在这里完成自己的登录逻辑。【注意】这里有个问题,后台记录了用户的状态,可是前端并没有,所以到这里,并不能实现同步登录。

此时需要前端请求后台,获取到cookie或者token才能真正实现同步登录,这就需要上面说的js代码,需要通过这段js代码让前端向后台发起请求,后台返回登录状态给前端。所以我说html不好做,因为必须要表现层能够接收请求,再发出请求,html并不能满足要求。这可能就是discuz和UCenter没落的原因。

2、java向discuz请求同步

这里就比较简单了,参照谷歌上的文档就可以了,就不赘述了。

目前就这么多内容,写得比较乱,也比较潦草,后面有时间好好整理一下,另外同步退出、同步注册、同步修改密码比较类似,暂时懒得写了

API下载链接:https://pan.baidu.com/s/1ML3tOSRL7qoG8kbqdGZw8w 密码: yrvh