乐虎国际 發表於 2019-7-9 16:43:03

java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)

一 Discuz论坛搭建步骤<br />&nbsp;&nbsp;1:服务器环境配置<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;服务器要支持php语言+支持mysql 5.0以上的数据库 + Apache服务器(支持网站的一个服务器,通过域名的能访问就可以了)<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Msql5.0以上的数据库一个。<br /><br />&nbsp;&nbsp;2:安装Discuz<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;(1)下载Discuz源码包http://www.discuz.net/thread-3570835-1-1.html<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;(2)解压源码包Discuz_X3.2_SC_GBK.zip(这里以Discuz X3/2为例)有三个文件,把&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;其中的upload文件夹里面的内容放在网站的根目录下。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 注意:<br /><br />是upload文件夹下面的所有内容放入网站根目录下,如果把upload整个文件夹放在网站根目录访问的地址就是http://localhost/upload)<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;(3)访问域名地址就开始安装如图:参考地址:<br /><br />http://jingyan.baidu.com/article/ac6a9a5ea76e022b653eacca.html<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br /><br />配置数据库信息:<br /><br />提前创建好mysql数据库,用户/密码,这里进行配置。同时给设置一个管理员账号和密码:点击下一步<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 注意:一定是mysql 5.0以上的数据库版本<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 如果没有问题的话就安装成功了。它会自动创建对应的数据库表等相关信息。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 然后访问域名就直接可以访问论坛了。<br /><br />  3:Discuz的简单配置介绍<br />&nbsp; &nbsp;&nbsp; &nbsp; (1)前台登录及管理员功能<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 如果是管理员的话会有一些管理信息<br /><br /> <br /><br />如果是管理员浏览帖子的话,会有“置顶”,“精华”,“明亮”等操作,如图:<br /><br /> <br /><br />具体还有很多,这里不一一介绍。<br /><br /> <br /><br />&nbsp; &nbsp;&nbsp; &nbsp; (2)后台管理心中<br />管理中心,就是进入后台管理的入口。主要是网站的风格,和布局<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 管理中心后台有很多功能,首先需要设置的是论坛大致板块,如下图:<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 对应的前台如下图:<br /><br /> <br /><br />我理解的时间也有限,具体设置还需要多进行操作,这里不进行逐个说明。<br /><br />二 Discuz论坛与java无缝对接(单点登录)<br />&nbsp;&nbsp;1: Discuz和java对接的原理<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Discuz和java对接需要一个中间件,它就是Ucenter。Comsenz(康盛)的UCenter当前在国内的单点登录领域占据绝对份额,其完整的产品线令UCenter成为了账号集成方面事实上的标准。基于UCenter,可以将Comsenz旗下的Discuz!(社区论坛系统)、SupeSite(门户CMS系统)、X-Space(博客系统)从用户资源层面进行无缝整合,使得账号实现统一管理,在任何一个系统中进行注册、登录、注销等操作时,该账号在其他系统中的会话状态也将同步更新,最终实现一号通的单点登录模式。<br /><br /> <br /><br />使用ucenter进行同步操作,主要依托于ucenter&nbsp;&nbsp;server 和ucenter client之间的api接口进行通讯。要使得通讯成为可能,首先要通过ucenter管理所用应用(通过配置使得当前应用和ucenter产生联系,也就是通讯成功)。其他应用通过挂接到ucenter的接口上,从而使得某些数据可以进行同步操作。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br /><br />&nbsp;&nbsp;2 : Discuz和Ucenter通道的配置<br />(1)Ucenter用户管理中心的简单介绍<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Discuz和Ucenter都属于Comsenz(康盛)公司的产品,所以Discuz和Ucenter之间的通信通道非常容易建立。<br /><br />&nbsp; &nbsp; Discuz中附带的有Ucenter应用程序例如:<br /><br />&nbsp; &nbsp; 之前Discuz论坛安装之后访问地址是http://localhost/ upload,那么Ucenter的访问地址是http://localhost/ upload/uc_server,登录界面如下:<br /><br /> <br /><br />输入之前的管理员密码即可登录成功!<br /><br />后台管理页面如下<br /><br /> <br /><br />(2)Ucenter于Discuz通道建立。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;我们如果用的是Discuz自带的Ucenter,他与Discuz就已经默认是互通的,我可以直接来用也可以重新配置。建立成功如下:<br /><br /> <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;注释:这里有系统默认的我们就直接用,下面Ucenter于java建立通道的时候会详细说明怎么建立通道,建立通信通道的方式都是一样的。<br /><br /> 3 : Java和Ucenter通道的配置<br />(1)Ucenter端添java web网站通道<br />登录成功之后<br /><br />应用管理》添加应用<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;标红的为主要填写的。其他的可以不填写。<br /><br /> <br /><br />安装方式:自定义<br /><br />应用类型:其他<br /><br />应用名称:JAVA项目名称,可随意<br /><br />应用主URL:JAVA项目的访问地址,例如:http://localhost:8080/javaTest<br /><br />通信密钥:任意字符,例如:123456<br /><br />应用接口文件名称:uc.php,这个不要改,前面也不要加/api/,UCenter在与其通信时会自动转换为:http://localhost:8080/javaTest/api/uc.php<br /><br />是否开启同步登录:是<br /><br />是否接受通知:是<br /><br />以上的配置项必填,其他保持为空即可。<br /><br />点击“提交”,保存成功后,记下该JAVA应用的APPID,下面的配置中会需要。<br /><br />此时返回应用列表,UCenter会自动进行通信验证,不出意外肯定会出现“通信失败”的字样,先不必管它<br /><br />因为java端也需要一些配置<br /><br />(2)java web网站端的配置<br />1、从“discuz-ucenter-api-for-java”的开源项目网站中下载相关的API文件,也可以从这里下载:JAVA_UCenter.zip<br /><br />这里给一个比较好的下载地址,包括源码,及jar包文件:<br /><br />http://code.google.com/p/discuz-ucenter-api-for-java<br /><br />2、将JAVA_UCenter.zip解压、覆盖到你的JAVA项目中,其中的新文件有:<br /><br />src/config.properties:本地的JAVA项目与UCenter的接口配置文件(需要根据实际环境进行配置)<br /><br />src/api/ucenter/Base64.java<br /><br />src/api/ucenter/Client.java:将常用的UCenter操作封装成的客户端对象,我们在项目中主要用它来与UCenter打交道<br /><br />src/api/ucenter/PHPFunctions.java<br /><br />src/api/ucenter/UC.java:本地的JAVA项目用来接收UCenter同步命令的Servlet接口,其访问地址必须为:/api/uc.php<br /><br />src/api/ucenter/XMLHelper.java<br /><br />WebRoot/WEB-INF/web.xml:主要就是将src/api/ucenter/UC.java定义为Servlet<br /><br /> <br /><br />注意:<br /><br />(1) src/config.properties中的代码如下:<br /><br /># ================================================<br /># Ucenter API for JAVA<br /># ================================================<br />UC_API = http://localhost:9201<br />UC_IP = <br />UC_KEY = 123456<br />UC_APPID = 2<br />UC_CONNECT = <br /><br />其中,UC_API表示UCenter的访问地址,UC_KEY就是在UCenter中添加新应用时定义的通信密钥,UC_APPID表示新应用的APPID,就是刚才记下的那个。<br /><br />除这三项外,其他的配置保持为空即可。<br /><br />(2) WebRoot/WEB-INF/web.xml中的代码如下:<br /><br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;web-app version=&quot;2.4&quot; <br />&nbsp; &nbsp; xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; <br />&nbsp; &nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; <br />&nbsp; &nbsp; xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee <br />&nbsp; &nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot;&gt;<br />&nbsp; &nbsp; <br />&nbsp;&nbsp;&lt;servlet&gt;<br />&nbsp; &nbsp; &lt;display-name&gt;同步UC Server发出的操作指令&lt;/display-name&gt;<br />&nbsp; &nbsp; &lt;servlet-name&gt;UC&lt;/servlet-name&gt;<br />&nbsp; &nbsp; &lt;servlet-class&gt;api.ucenter.UC&lt;/servlet-class&gt;<br />&nbsp; &nbsp; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />&nbsp;&nbsp;&lt;/servlet&gt;<br />&nbsp;&nbsp;&lt;servlet-mapping&gt;<br />&nbsp; &nbsp; &lt;servlet-name&gt;UC&lt;/servlet-name&gt;<br />&nbsp; &nbsp; &lt;url-pattern&gt;/api/uc.php&lt;/url-pattern&gt;<br />&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br />&nbsp;&nbsp;<br />&lt;/web-app&gt;<br /><br />别的无所谓,只需注意这一行:&lt;url-pattern&gt;/api/uc.php&lt;/url-pattern&gt;<br /><br />3、JAVA端配置完成,在eclipse中启动调试模式<br /><br />4、再次返回到UCenter的控制台,点击应用管理,此时应该会看到绿色的“通信成功”字样<br /><br /> <br /><br /> <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;到这里Discuz和Ucenter之间的通信通道与java和Ucenter之间的通信通道都已经建立成功,下面就可以在2.3.4看具体如何开发<br /><br /> <br /><br />2.3.4&nbsp;&nbsp;Java端具体代码实现<br />(1)java网站web 网站注册同步Discuz论坛注册<br />1&gt; 步骤说明:<br /><br />注册java网站web网站 &gt; 调用Client里面的UC注册Discuz论坛的接口(uc_user_register) &gt; 判断注册结果<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2&gt;具体代码实现(仅供参考)<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//java网站网站的注册<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;boolean falg = tempUserService.insert(tempUserVO);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;//同步论坛的注册<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;if(falg){<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Client uc = new Client();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;String $returns = uc.uc_user_register(tempUserVO.getUsername(), tempUserVO.getPass(), tempUserVO.getEamil());<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;int $uid = Integer.parseInt($returns); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if ($uid &lt;= 0) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if ($uid == -1) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;用户名不合法&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if ($uid == -2) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;包含要允许注册的词语&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if ($uid == -3) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;用户名已经存在&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if ($uid == -4) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;Email 格式有误&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if ($uid == -5) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;Email 不允许注册&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if ($uid == -6) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;该 Email 已经被注册&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.print(&quot;未定义&quot;); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.out.println(&quot;id:&quot;+$uid);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println(&quot;添加成功!&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;}else{<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println(&quot;添加失败!&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;}<br /><br />(2)java网站web 网站登录,同步Discuz论坛登录<br />1&gt; 步骤说明:<br /><br />登录民信web网站 &gt; 调用Client里面的UC登录接口获取用户信息 &gt; 接受返回的用户XML信息并解析 &gt; 调用Client登录DIscuz论坛的登录接口 &gt; 接受返回过来的js代码 &gt; 输出到java网站web网站 &gt; 跳转到论坛地址(此时已经你会发现用户已经登录)<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2&gt;具体代码实现(仅供参考)<br /><br />//网站的登录<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;TempUser tempUser =&nbsp;&nbsp;tempUserService.queryByName(tempUserVO.getUsername());<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;System.out.println(&quot;结果:&quot;+tempUser.getAddress()+&quot;&nbsp;&nbsp;==&quot;+tempUser.getEamil());<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;request.getSession().setAttribute(&quot;tempUser&quot;, tempUser);<br /><br />&nbsp; &nbsp;&nbsp;&nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;//Discuz论坛的登录<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;Client uc = new Client();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;String $result = uc.uc_user_login(tempUser.getUsername(), tempUser.getPass());<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;String $ucsynlogin = &quot;&quot;;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp; LinkedList&lt;String&gt; rs = XMLHelper.uc_unserialize($result);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if(rs.size()&gt;0){<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;int $uid = Integer.parseInt(rs.get(0));<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;String $username = rs.get(1);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;String $password = rs.get(2);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;String $email = rs.get(3);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if($uid &gt; 0) {<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; $ucsynlogin = uc.uc_user_synlogin($uid);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if($uid == -1) {<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.println(&quot;用户不存在,或者被删除&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else if($uid == -2) {<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.println(&quot;密码错&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;} else {<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; System.out.println(&quot;未定义&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//设置本地Discuz登录的cookie信息,cookie存活时间<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//直接访问论坛就有用户信息了<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;try {<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;response.setCharacterEncoding(&quot;UTF-8&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//同步Cookie信息<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; response.addHeader(&quot;P3P&quot;,&quot; CP=\&quot;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR\&quot;&quot;);<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Cookie auth = new Cookie(&quot;auth&quot;, uc.uc_authcode($password+&quot;\t&quot;+$uid, &quot;ENCODE&quot;));<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;auth.setMaxAge(31536000);<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//auth.setDomain(&quot;localhost&quot;);//设置本地cookie<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;response.addCookie(auth);<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Cookie user = new Cookie(&quot;Discuz_loginuser&quot;, $username);<br /><br />//&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;response.addCookie(user);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//把返回过来的js文件直接输出在页面上,然后跳转到论坛网站首页就已经是登录之后的<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;PrintWriter out = response.getWriter();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.write($ucsynlogin);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; out.flush();&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (Exception e) {<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; // TODO Auto-generated catch block<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; e.printStackTrace();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}else{<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println(&quot;Login failed&quot;);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br /><br />//&nbsp; &nbsp; System.out.println(&quot;登录的结果:&quot;+$result);<br /><br />(3)java网站退出,论坛同步退出<br />1&gt; 步骤说明:<br /><br />java网站网站注销 &gt; 调用Client里面的uc_user_synlogout同时注销论坛用户<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2&gt;具体代码实现(仅供参考)<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Client uc = new Client();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;String $ucsynlogout = uc.uc_user_synlogout();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;System.out.println(&quot;退出成功&quot;+$ucsynlogout);<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;return $ucsynlogout;<br /><br />(4)java网站修改用户信息同步论坛资料信息<br />1&gt; 步骤说明:<br /><br />修改用户保存 &gt; 获取之前论坛用户信息 &gt; 调用接口进行修改uc_user_edit<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;2&gt;具体代码实现(仅供参考)<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; Client uc = new Client();<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;uc.uc_user_edit($username, $oldpw, $newpw, $email, $ignoreoldpw, $questionid, $answer)<br /><br /> <br /><br />主要代码片段<br /><br />&nbsp; &nbsp;<br /><br />(5)论坛登录同步登录java网站web<br />&nbsp; &nbsp; 我们来看看discuz那边登录了,java这边怎么实现同步登录。在uc.java里有一个doanswer的方法。所有同步操作都在这个方法里完成。其逻辑是这样的,uc这个类继承了HttpServlet。当ucenter发出通知时,会访问这个servlet.并执行他的doGet()方法。doGet()调用doAnswer().<br /><br />&nbsp;&nbsp;String $code = request.getParameter(&quot;code&quot;);会传一个code进来(加密了的)。然后调用$code = new Client().uc_authcode($code, &quot;DECODE&quot;);进行解密操作。新建一个Map,Map&lt;String,String&gt; $get = new HashMap&lt;String, String&gt;();然后根据解密出来的code的内容封装这个Map.调用这个方法,parse_str($code, $get); 经过以上操作后,所有同步操作需要的信息都在map里,如action。action代表的是什么操作,如同步登录,同步退出,修改密码等。还有其他信息,如username.登录的用户名。改密码时还会传新密码过来。所有的这些都包含在这个叫$get的Map里。然后我们就可以进行我们自己的逻辑操作了。(以上逻辑不想理解没关系,你只要知道当你在discuz登录之后,uc.java的doAnswer()方法就会被调用,你所需要的一切信息都包含在$get这个Map里)<br /><br />&nbsp; &nbsp;操作到这里,你一定想吐槽笔者!不行啊,discuz那边登录了,java这边完全没反应啊!!doAnswer方法没有被调用啊!是的,你还需要到discuz后台做一些设置。管理中心-&gt;站长-&gt;ucenter设置。把ucenter连接方式改为接口方式。然后,你登录discuz时,doAnswer()方法就会被调用了。(其他操作如退出也一样)<br /><br /> <br /><br />注意乱码问题:&nbsp; &nbsp;<br /><br />Discuz登录同步java网站web网站登录,中文乱码问题<br /><br />&nbsp; &nbsp;&nbsp;&nbsp;到这里,我们又遇到了中文的问题了,discuz用中文登录的时候不行啊!是的,这确实是个比较麻烦的问题。笔者也弄了好久。原因是这样的,上面提到过,传进来的$code是需要uc_authcode()方法进行解密的,当中文的时候解密出来的$code是&quot;&quot;.解决方法如下:在Client.java的uc_authcode()方法里找到这句String $result = $result1.substring(0, $result1.length());并把它改成:&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br /><br />?<br /><br />1<br /><br />2<br /><br />3<br /><br />4<br /><br />5<br /><br />6<br /><br />7<br /><br />String $result= $result1.toString(); <br /><br />&nbsp; &nbsp;try{ <br /><br />&nbsp; &nbsp;&nbsp; &nbsp;$result=new String($result.getBytes(&quot;iso-8859-1&quot;),&quot;GBK&quot;);<br /><br />&nbsp; &nbsp; }catch (Exception e) { <br /><br />&nbsp; &nbsp;&nbsp; &nbsp; $result = $result1.substring(0, $result1.length()); <br /><br />&nbsp; &nbsp;&nbsp; &nbsp; // TODO: handle exception <br /><br />&nbsp; &nbsp; }<br /><br />这样还不行,解密出来的code中文部分仍是乱码。所以在uc.java的$code = new Client().uc_authcode($code, &quot;DECODE&quot;);这句下面还要加上$code = new String($code.getBytes(&quot;GBK&quot;),&quot;UTF-8&quot;);可能有人会说直接转成utf-8不行吗?为什么要先转成gbk呢?如果直接转成utf-8的话,解密出来的$code是&quot;&quot;。到此中文的问题就得到解决了。笔者下载的是GBK版本的discuz,其他情况自己改一下编码应该没问题。uc<em>, </em>登录<em>, </em>java<em>, </em>Discuz<em>, </em>论坛

乐虎国际 發表於 2019-7-9 16:43:22

以上内容转载https://www.cnblogs.com/puqiuxiaomao/p/4037092.html

shajian 發表於 2019-9-1 13:06:33

为什么我返回的那个script的链接执行一直返回-1
頁: [1]
查看完整版本: java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)