Discuz3.2与Java 项目整合单点登陆
2015-12-22 14:37
417 查看
原理Discuz和JAVA对接需要一个中间件,它就是Ucenter。Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准。基于UCenter,可以将Comsenz旗下的Discuz!(社区论坛系统)、SupeSite(门户CMS系统)、X-Space(博客系统)从用户资源层面进行无缝整合,使得账号实现统一管理,在任何一个系统中进行注册、登录、注销等操作时,该账号在其他系统中的会话状态也将同步更新,最终实现一号通的单点登录模式。使用UCenter进行同步操作,主要依托于UcenterServer和UcenterClient之间的api接口进行通讯。要使得通讯成为可能,首先要通过Ucenter管理所用应用(通过配置使得当前应用和Ucenter产生联系,也就是通讯成功)。其他应用通过挂接到Ucenter的接口上,从而使得某些数据可以进行同步操作。
整个分为两大部分:
1.整合部分(包括代码嵌入、UCenter配置、方法调用)
2.问题部分(如何免激活登陆、中文登录名乱码问题等)
整合部分
首先,当然是进行项目整合。开始这一部分的前提是你的论坛已经启动并且安装好UCenter。
如果论坛没有安装可以参考上篇--------------->
据了解Discuz3.x以下的版本是不带UCenter的,之前的就不去探讨了,如果没有的话另外安装就行。这边3.2版的论坛已经集成好了。
1、使用admin登陆论坛的UCenter控制中心,这个地方就是用admin登陆后进入到管理中心就可以看到菜单如下。
2、进入UCenter后,点击左边菜单“应用管理”,右边会默认出现一条信息,这是当前的论坛,UCenter默认将论坛纳入到了统一管理,这个时候就要进行我们的新应用(JAVAWEB)的添加,理论上是可集成任何项目,这也是康盛开发这个统一用户管理中心的目的,废话不多说下面开始配置我们的项目吧。
3、点击当前页面上的“添加新应用”,进行WEB项目配置如下图。
ID:这个记住,配置WEB项目时需要。
应用类型:这个可以根据自己的项目选,如果不在里面的选项选“其他”,这个应该对集成影响不大,猜想应该是UCenter对存在的这几种类型的应用有更好的优化支持。
应用名称:这个就随意了,写项目名称可以,别的也行,只是为了自己能区分。
应用的主URL:填自己的JAVA_WEB项目主访问路径,结尾带不带“/”貌似并不像它提示的那样有影响。我这边是都可以的,不过为了避免集成过程中出现未知问题,先按这个来配,路径结尾不带“/”,成功后你可以测试下路径带“/”。
通信密钥:这个任意字符,但一定要和JAVA_WEB里面的配置文件一致。后面WEB配置会提到。
应用接口文件名称:uc.php,这个是默认的,如果改了请恢复,UCenter在与其通信时会自动转换为
是否开启同步登陆:是
是否接受通知:是
这样整个应用添加就完成了,直接提交返回到“应用管理”的主页面看,会发现多了一条信息,这个就是你配置的应用了。
好的,相信聪明的你已经发现问题了,一个大红X通信失败,不用担心,因为我们的Web端还需要一些配置。
4、进行JavaWeb端的配置
a.我们需要discuzjavaapi的支持,里面包含jar和源码,下载地址:
b.将下载的架包放到自己的项目中,也可以将源码直接放到项目里。结构如下
src/api/ucenter/Base64.javasrc/api/ucenter/Client.java:将常用的UCenter操作封装成的客户端对象,我们在项目中主要用它来与UCenter打交道src/api/ucenter/PHPFunctions.javasrc/api/ucenter/UC.java:本地的JAVA项目用来接收UCenter同步命令的Servlet接口,其访问地址必须为:/api/uc.phpsrc/api/ucenter/XMLHelper.javasrc/config.properties:本地的JAVA项目与UCenter的接口配置文件(需要根据实际环境进行配置)WebRoot/WEB-INF/web.xml:主要就是将src/api/ucenter/UC.java定义为Servlet5、进行config.properties配置
# #================================================ #*Discuz!UcenterAPIforJAVA #================================================ #UCcomunicationsettings # # #ucserverurl UC_API=http://10.10.10.14/upload/uc_server
#ucipaddress可留空
UC_IP=10.10.10.14
#key
UC_KEY=123456789
#appid这里对应的就是你在UCenter新添加应用的时候ID
UC_APPID=2
#connectmode:defaultvalueis""
UC_CONNECT=
6、进行web.xml配置,添加下面这段。
<servlet> <servlet-name>api</servlet-name> <servlet-class>com.discuz.interfaces.bbs.api.UC</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>api</servlet-name> <url-pattern>/api/uc.php</url-pattern> </servlet-mapping>
7、整个配置就完成了,启动Web服务器后,打开UCenter控制台可以看到应用已经通讯成功了。
8、下面就是代码整个注册、登陆、退出了。我主要是想由UCenter来统一管理用户,所以用户标准以UCenter为准,下面是我测试写的demo,各位仅作参考
a.注册
publicStringexecute(){
ActionContextctx=ActionContext.getContext();
StringtipStr="";
ClientuClient=newClient();
String$returns=uClient.uc_user_register(user.getUserName(),user.getPassword(),user.getEmail());
int$uid=Integer.parseInt($returns);
if($uid<=0){
if($uid==-1){
tipStr="用户名不合法!!";
}elseif($uid==-2){
tipStr="包含要允许注册的词语!!";
}elseif($uid==-3){
tipStr="用户名已经存在!!";
}elseif($uid==-4){
tipStr="Email格式有误!!";
}elseif($uid==-5){
tipStr="Email不允许注册!!";
}elseif($uid==-6){
tipStr="该Email已经被注册!!";
}else{
tipStr="未定义!!!";
}
}else{
System.out.println("OK:"+$returns);
if(newUserDAOImpl().addUser(user)){
returnSUCCESS;
}else{
tipStr="平台数据库插入失败!";
}
}
ctx.put("tip",tipStr);
returnERROR;
}
b.登陆
publicStringexecute(){
ActionContextctx=ActionContext.getContext();
StringtipStr="";
if(!"".equals(user.getUserName())){
//获取Ucenter的登陆结果,同步其他应用的登陆状态
Clientuc=newClient();
Stringresult=uc.uc_user_login(user.getUserName(),user.getPassword());
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){
System.out.println("Ucenter登陆成功:"+$username+""+$password+""+$email);
String$ucsynlogin=uc.uc_user_synlogin($uid);
System.out.println("Ucenter登陆成功:"+$ucsynlogin);
//进行自己系统的登陆权限判断
if(user.getPassword().equals(newUserDAOImpl().checkUser(user.getUserName()))){
ctx.put("uclogin",$ucsynlogin);
ctx.getSession().put("user",user);
returnSUCCESS;
}
}elseif($uid==-1){
tipStr="用户不存在,或者被删除!";
}elseif($uid==-2){
tipStr="密码错误!";
}else{
tipStr="未定义!";
}
ctx.put("tip",tipStr);
returnERROR;
}
ctx.put("tip",result);
}
returnERROR;
}
上面标黄部分$ucsynlogin,需要把它存到session中,然后在登陆成功的主页面上调用一下,一定要!其原理就是相当于让浏览器去访问下自己应用与另外一个应用,分别同步下双方的cookie等操作。它的值如下:
<scripttype="text/javascript"src="http://192.168.15.110:8080/nocopy/api/uc.php?time=1295926163&code=c8d08KSlEZlDk4tTsjChzRYzZp2EpUierc%2FS3NLnFUviig8HvTnDNymm080JxI8Byl%2F1TW%2FveKQRlR14Io9pvR9eMD1F%2FAH3l1tuzWt3Rw9MQLrK5Lz0q8eMn5%2BAae92YBwwNlWiFWHyfyh%2FzUNC%2FA3HFnEgdX%2F61IwV"reload="1"></script
页面上直接取到这个值就行了。
<!DOCTYPEhtml>
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
<title>高大上的店</title>
<linkrel="stylesheet"href="./css/style.css"type="text/css">
<scriptsrc="./js/jquery.js"type="text/javascript"></script>
<scriptsrc="./js/itpbase.js"type="text/javascript"></script>
<scriptsrc="./js/iframe_auto_height.js"type="text/javascript"></script>
<scriptsrc="./js/menuTree.js"type="text/javascript"></script>
</head>
${uclogin}
<bodybgcolor="#EBF9FA">
<formaction="">
</form>
</body>
</html>
c、登出
同上一样的操作,页面上需要加载$ucsynlogout。
publicStringexecute(){
ActionContextctx=ActionContext.getContext();
StringtipStr="";
//获取Ucenter的登陆结果,同步其他应用的登陆状态
Clientuc=newClient();
String$ucsynlogout=uc.uc_user_synlogout();
if($ucsynlogout!=null){
ctx.getSession().clear();
ctx.put("uclogout",$ucsynlogout);
//System.out.println("退出成功:"+$ucsynlogout);
returnSUCCESS;
}
ctx.put("tip",$ucsynlogout);
returnERROR;
}
相关文章推荐
- 多模块Maven项目如何使用javadoc插件生成文档
- @Transactional(readOnly=true) in Spring
- JavaEE maven 综合实践
- JAVA 如何循环枚举(main函数里)
- 解决 java 中引用的jar包乱码问题
- spring 使用 context:property-placeholder 加载 多个 properties
- Java线程池学习笔记二
- Java socket broken pipe
- Java BIO/NIO/AIO
- Java中的线程池——ThreadPoolExecutor的使用
- spring-core报错java.lang.IllegalArgumentException: null
- 基本算法_堆排序_Java实现
- Java线程池学习笔记一
- java性能优化读书笔记之三《程序优化===集合优化(list)》
- JDK8之HashSet
- Ubuntu安装JDK
- java启动spring容器
- SpringMVC深度探险
- struts2拦截器中 如果获取当前请求action 和请求的方法
- struts2 ,session失效,拦截器