UCenter在JAVA项目中实现的单点登录应用实例
Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准。
基于UCenter,可以将Comsenz旗下的Discuz!(社区论坛系统)、SupeSite(门户CMS系统)、X-Space(博客系统)从用户资源层面进行无缝整合,使得账号实现统一管理,在任何一个系统中进行注册、登录、注销等操作时,该账号在其他系统中的会话状态也将同步更新,最终实现一号通的单点登录模式。
UCenter具备良好的扩展性,除了完美兼容自家的各种系统外,还支持其他项目的集成。
我现在准备做的,就是要在一个JAVA项目中,将会员账号部分与UCenter保持同步,以便将来可以顺利的嵌入Discuz!社区论坛系统。
幸好,已经有人为我们写好了一个面向JAVA的UCenter接口方案,其项目地址为:http://code.google.com/p/discuz-ucenter-api-for-java
我本次也是基于这个名叫discuz-ucenter-api-for-java的API来实现,感谢作者ping.china
一、准备工作
1、下载UCenter:http://www.comsenz.com/downloads/install/ucenter
2、将UCenter部署到支持PHP脚本的服务器上,然后按照向导进行安装即可。
3、访问UCenter控制台,添加新应用,其中:
安装方式:自定义
应用类型:其他
应用名称:JAVA项目名称,可随意
应用主URL:JAVA项目的访问地址,例如:http://localhost:8080/javaTest
通信密钥:任意字符,例如:123456
应用接口文件名称:uc.php,这个不要改,前面也不要加/api/,UCenter在与其通信时会自动转换为:http://localhost:8080/javaTest/api/uc.php
是否开启同步登录:是
是否接受通知:是
以上的配置项必填,其他保持为空即可。
点击“提交”,保存成功后,记下该JAVA应用的APPID,下面的配置中会需要。
此时返回应用列表,UCenter会自动进行通信验证,不出意外肯定会出现“通信失败”的字样,先不必管它
二、JAVA项目配置
1、从“discuz-ucenter-api-for-java”的开源项目网站中下载相关的API文件,也可以从这里下载:JAVA_UCenter.zip
2、将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>
3、JAVA端配置完成,在eclipse中启动调试模式
4、再次返回到UCenter的控制台,点击应用管理,此时应该会看到绿色的“通信成功”字样
三、在JAVA项目中如何具体与UCenter进行通信
做到这里,JAVA项目与UCenter的基本集成工作已经圆满完成。
至于在JAVA中如何使用Client对象与UCenter进行同步通信,就很简单了, 具体可以到discuz-ucenter-api-for-java的开源项目中查看
四、让JAVA项目与Discuz!进行会话状态同步
1、在JAVA项目中登录、退出,同步到Discuz!
在JAVA项目中,用户登录成功之后,需要执行以下代码:
Client uc = new Client();
String $ucsynlogin = uc.uc_user_synlogin($uid);
out.println($ucsynlogin);
其中的$ucsynlogin其实是一段JavaScript代码,这段代码是从UCenter返回的
目的就是向已经在UCenter中注册的应用发送状态同步请求,保持会话状态一致性
所以,就要保证$ucsynlogin中的JS代码必须输出到浏览器,并且成功执行
2、在Discuz!中登录、退出,同步到JAVA项目
首先,要注意一个配置选项,位于Discuz!管理控制台的:站长 - UCenter设置中
UCenter 连接方式:必须选择“接口方式”,如果选择“数据库方式”,则不会向其他应用发送同步请求
然后,在我们JAVA项目中,作为与UCenter对话的窗口,src/api/ucenter/UC.java就会负责接收其他应用通过UCenter发送过来的会话状态同步请求
其中的$action.equals("synlogin")为登录同步,修改其中对Cookie的赋值代码,实现本地系统的会话也保持登录状态
其中的$action.equals("synlogout")为登出同步,同样,修改代码,实现本地的登出同步。
注意其中的一行代码:
response.addHeader("P3P","CP=\"CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\"");
意思是要求浏览器对当前的Cookie操作宽容对待,如果涉及跨域操作也不要阻止。所以,这行代码原样保留,可以使状态同步更加稳定。
五、已知问题
貌似使用中文注册的账号,在同步时可能会因为Base64解码不一致的原因发生问题,具体我还没有测试,等到发生时再详细记载。
UCenter在JAVA项目中实现的单点登录应用实例的更多相关文章
- java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)
标题有点问题,没有进行修改. 一 Discuz论坛搭建步骤 1:服务器环境配置 服务器要支持php语言+支持mysql 5.0以上的数据库 + Apache服务器(支持网站的一个服务器,通过域名的能访 ...
- eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN
eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...
- java项目中build path的设置
右键点击项目新建文件libs 添加jtds jar包引用本地动态链接库(dll)的设置方法 配置LibraryJRE的添加和更换 Java项目中build path的设置总结,包括JRE的添加和更 ...
- 在Java项目中整合Scala
Scala是一个运行在Java JVM上的面向对象的语言.它支持函数编程,在语法上比Java更加灵活,同时通过Akka库,Scala支持强大的基于Actor的多线程编程.具有这些优势,使得我最近很想在 ...
- XML在JAVA项目中的作用
java项目中,xml文件一般都是用来存储一些配置信息 一般的编程, 多数用来存储配置信息 . 拿JDBC来说,可以把数据库连接字符串写到xml,如果要修改数据源,只需要改xml就可以了,没必要再去重 ...
- ckeditor编辑器在java项目中配置
一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...
- redis在java项目中的使用
在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...
- Redis学习笔记之二 :在Java项目中使用Redis
成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...
随机推荐
- contos7忘记root密码怎么办
首先在这个界面按"e"键 然后呢就会进入到如下图所示的界面,在LANG=zh_CN.UTF8的后面加上 init=/bin/sh, 再按 [ Ctrl + X ] 进入'单用户模式 ...
- 对一致性Hash算法及java实现(转)
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 有意思的Alias参数
1. 最简单的方式,运行正常. PS C:\> Get-Service -Name BITS -ComputerName localhost 2. 自己构造一个对象,试图通过管道将主机名传递下去 ...
- http和https的优缺点,区别与工作原理
文章内容 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...
- BugScan插件编写高(gǎo)级(jī)教程
声明:本文最先发布在:http://q.bugscan.net/t/353 转载请注明出处 有问题可以和我交流 邮件(Medici.Yan@gmail.com) 个人博客地址:http://www.c ...
- 如何从 GitHub 上下载单个文件夹?
比如别人把一些资料传到 GitHub 上做分类归档,我怎么才能下载单一分类文件夹? 点击 Raw ,如果是不能预览的文件就会自动下载,如果是文件或者代码什么的,会在浏览器中显示,但可以复制浏览器中链接 ...
- BZOJ5118 Fib数列2(矩阵快速幂)
特殊矩阵的幂同样满足费马小定理. #include<iostream> #include<cstdio> #include<cmath> #include<c ...
- BZOJ3244 NOI2013树的计数(概率期望)
容易发现的一点是如果确定了每一层有哪些点,树的形态就确定了.问题变为划分bfs序. 考虑怎样划分是合法的.同一层的点在bfs序中出现顺序与dfs序中相同.对于dfs序中相邻两点依次设为x和y,y至多在 ...
- java10 新特性 详解
引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...
- 【uoj121】 NOI2013—向量内积
http://uoj.ac/problem/121 (题目链接) 题意 给出${n}$个${d}$维向量,问是否有两个不同的向量的内积是${k}$的倍数. Solution 又卡了一上午常数,我弃了T ...