一、需求分析

    有个JAVA项目与一个Discuz论坛需要整合,使得它们之间能实现单点登录功能。可是Discuz是PHP写的,两者语言不通该如何整合呢?查阅官方资料发现,Discuz并未开放说有什么用户接口之类的。但却发现了这货UCenter,显然这货与Discuze是一家人。so,接下来的整合我们即将用到UCenter作为中间件来实现不通语言项目之间用户的共享。


二、关于UCenter

    介绍方法之前,我觉得还是有必要先说说UCenter,理解了它的工作原理是很有必要的。

    UCenter 的中文意思就是“用户中心”,其中的 U 代表 User,也代表 You,取其中的含义就是“用户中心”,或者说“你(最终用户)的中心”。UCenter 是今后 Comsenz 旗下各个产品之间信息直接传递的一个桥梁。通过 UCenter,站长可以无缝整合 Comsenz 系列产品,甚至更多的第三方应用,实现用户的一站式登录和个人信息、积分等资料的统一管理。

    以上是官方介绍,说白了,它就是座桥梁。例如A应用中用户登录了,通知UCenter,然后UCenter再把这消息通知给B啊C啊等等其它的应用,从而实现了单点登录。说的太累,那就请看下方这幅图(转至网络):

wKiom1ThRLaj6N6aAAC75IFJVWk495.jpg

恩,大概流程是这样子的。用户登录了,发送通知给UCenter Service。然后UCenter再推送消息给别的应用,应用接受消息设置cookie等,实现了同步登录、登出。


三、方法步骤

    1、设置UCenter:

    在装完Discuz时,我们一般都会勾选同步安装UCenter,那么你就可以从Discuz后台,登录到UCenter后台去进行设置,如图:

wKiom1ThRnfQD6XMAAE58r3YW5A079.jpg

    或者你输入http://localhost(或ip)/uc_server 也可以跳转到登录页面。选择管理员身份登录,账户密码就是Discuz管理后台的管理员账户密码。

    但是,这儿会出现个小BUG。Discuz升级到3.x版本后,这儿登录却毫无反应。官方社区已经提供了解决的办法,其实很简单,只要修改admin.php文件就可以了。而文件则在你项目的uc_server/model/admin.php 如图:

wKiom1ThR-mQeoLpAAV_1IpWo0U087.jpg

打开文件后如下图红色框内的信息:

wKioL1ThSUvhQH9VAAIDuH_c30Y675.jpg

恩,修改好后,保存退出重新登录就OK了。

    2、UCenter后台应用设置

wKiom1ThSSeDzwIbAAGIMVtU_ck789.jpg

    在应用管理中可以看到ID为1的Discuz应用,此时你该做的就是添加你想要在这平台上整合的其它应用。

wKioL1ThSoCR4BBEAAMltGWTlaY130.jpg

如图填写咯,都有些注释,如果你还是不清楚的话,请戳这儿:http://faq.comsenz.com/library/UCenteruse/useuse/useuse_addapp.htm 官方教程。

    添加好后,你会看到应用管理中如下图:

wKiom1ThSi-hKetwAAKERXeURpU547.jpg

多了个应用,请牢牢记住这个新应用的ID和之前添加时填写的通信秘钥,到时候会用的上的。而在右方显示通信失败时正常的,莫慌,因为你的另一个应用还没启动,还没配置好啊!

    3、新应用中的文件配置

    这个新应用呢,就是要整合的JAVA项目咯。首先,请看这儿:http://faq.comsenz.com/library/UCenter/introduction/introduction_interface.htm 这是Discuz社区开放的UCenter开发接口,遗憾的是它的例子同样也是php写的。但早已经有人根据接口写了个java版的接口了,叫做:discuz-ucenter_api_for_java 。本文的例子也是通过它实现的,Demo结构图如下。

wKiom1ThTRLQBYzpAAGVjVOw9jQ856.jpg

    好的,我们先来修改下最为重要的配置文件:config.properties(Demo项目中是这个配置文件,具体要依据你如何整合到自己项目中做修改变更,例如我整合到我自己的项目中后就是application.properties文件)

wKioL1ThTo3yuh9AAAPyA4Om6u8603.jpg

UC_API是你discuz项目中UCenter的接受信息地址(不一定要ip地址,可以使你的域名地址),这个地址下会有个uc.php文件接收处理信息。

UC_IP是为了防止你项目域名解析不正确,而写实际的IP地址。

UC_KEY是添加在UCenter后台管理中添加新应用时该应用的通信密钥。

UC_APPID是应用的ID哦~之前有提醒过哦。

    当然,还有个配置得做,那就是你得web.xml文件:

wKioL1ThUC7ifu-1AAQLBqGzB6U818.jpg

    都配置好后,我们就开始测试咯。等等,还得说下,UC.java这个其实是处理UCenter发送来的信息。而PHPFuctions.java则是应用发送请求给UCenter的处理类。Demo里大家可以去分析看看。

    4、测试结果

wKioL1ThU6zwU8gbAAD5--FZOa0945.jpg

    运行Jsp_demo.jsp文件哦,记得你的先注册个号通知UCenter,这儿有个疑惑:当你注册完后,UCenter数据库里是有新用户,然而它并未通知给discuz,discuz中却无新用户数据,所以第一次注册并未能同步到用户,得需要新用户到discuz登录过一次后,才能把用户数据相互同步。

    当你登录成功,会发现收到段返回的JS代码:wKioL1ThVK2ynT7HAAFXhk2UYcU102.jpg

    没错,这段js代码则是再一次发送请求给UCenter跟他说,哥们,我已经正确登录了,修改了cookie那些,麻烦你跟其它家伙说下,让它们也跟我同步呗。所以说这段JS代码很重要。如果它返回错误或请求通信失败等,也就都无法实现应用同步了。

    5、本文的Demo已经把原接口做了些转码修改,完美的解决了中文注册、登录等问题。


三、结语

    马上就过年了,这是今年的最后一篇博文,写的略显仓促。提前祝福大家,新年快乐!在新的一年,朝着大牛路一步一个脚印。还是当初那句话:分享是种快乐,坚持是种精神。


由于文章附件只能上传2M以内,我吧demo传到了百度网盘:http://pan.baidu.com/s/1CUfhk