通过查阅一些资料和自己项目中的实际操作来写
一.准备工作
访问UCenter控制台,添加新应用,其中
安装方式:自定义
应用类型:其他
应用名称:JAVA项目名称,可随意
应用主URL:JAVA项目的访问地址,例如:http://localhost:8080/javaTest
通信密钥:任意字符,例如:123456
应用接口文件名称:uc.php,这个不要改,前面也不要加/api/,UCenter在与其通信时会自动转换为:http://localhost:8080/javaTest/api/uc.php
是否开启同步登录:是
是否接受通知:是
以上的配置项必填,其他保持为空即可。
点击“提交”,保存成功后,记下该JAVA应用的APPID,下面的配置中会需要。
此时返回应用列表,UCenter会自动进行通信验证,不出意外肯定会出现“通信失败”的字样,先不必管它
应用项目配置
1. 将文件中对应代码覆盖到咱们需集成的系统中
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中的代码如下:
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中的代码如下:
<?xmlversion="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项目与Discuz!进行会话状态同步
1.在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=\"CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR\"");
意思是要求浏览器对当前的Cookie操作宽容对待,如果涉及跨域操作也不要阻止。所以,这行代码原样保留,可以使状态同步更加稳定。
二.河北集客修改部分说明
1. 新加入包和类(此为Discuz接口)
论坛种转控制类
论坛中转jsp
2. 修改部分
在web.xml中修改部分(论坛通信所用)
在SecurityAuthcFilter中修改部分 因为只有在这里才能拿到原始的用户名和密码
处理论坛登录信息:
public String loginForum(String username,String password)
{
Client uc = new Client();
String result =uc.uc_user_login(username, password);
LinkedList<String> rs =uc_unserialize(result);
String $ucsynlogin="";
if(rs.size()>0){
int $uid = Integer.parseInt(rs.get(0));
if($uid > 0) {
$ucsynlogin =uc.uc_user_synlogin($uid);
} else if($uid == -1) {
logger.info(username +":用户名不存在,或者被删除" );
} else if($uid == -2) {
logger.info(username +":登录论坛密码错误" );
} else {
logger.info(username +":未定义" );
}
}else{
System.out.println(result);
}
return $ucsynlogin;
}
解析返回xml信息
public LinkedList<String>uc_unserialize(String input){
LinkedList<String> result = new LinkedList<String>();
DOMParser parser = new DOMParser();
try {
parser.parse(new InputSource(new StringReader(input)));
Document doc = parser.getDocument();
NodeList nl = doc.getChildNodes().item(0).getChildNodes();
int length = nl.getLength();
for(int i=0;i<length;i++){
if(nl.item(i).getNodeType()==Document.ELEMENT_NODE)
result.add(nl.item(i).getTextContent());
}
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
在原有基础上修改部分:
上面session是在accessforum-index.jsp中用到的
三 以上配置完成之后基本上就已经可以正常访问了 不过这里 我们通过web项目进行注册时,需要先激活一次才能 正常登录,下面是解决方案(通过查阅网上资料)
通过修改下面的内容
(1) Upload/uc_server/model/user.phpàadd_user
function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {
$regip = empty($regip) ? $this->base->onlineip : $regip;
$salt = substr(uniqid(rand()), -6);
$password = md5(md5($password).$salt);
$sqladd = $uid ? "uid='".intval($uid)."',": '';
$sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid,$answer)."'," : " secques='',";
$this->db->query("INSERT INTO".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");
$uid = $this->db->insert_id();
$this->db->query("INSERT INTO".UC_DBTABLEPRE."memberfields SET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0',timeoffset='9999'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."',lastactivity='".$this->base->time."',lastpost='0', lastsendmail='0'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_profile SET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_field_forum SET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_field_home SET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0',extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0',extcredits7='0', extcredits8='0'");
return $uid;
}
(2) Upload/uc_client/model/user.php-àadd_user
function add_user($username,$password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {
$regip = empty($regip) ? $this->base->onlineip : $regip;
$salt = substr(uniqid(rand()), -6);
$password = md5(md5($password).$salt);
$sqladd = $uid ? "uid='".intval($uid)."',": '';
$sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid,$answer)."'," : " secques='',";
$this->db->query("INSERT INTO".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");
$uid = $this->db->insert_id();
$this->db->query("INSERT INTO".UC_DBTABLEPRE."memberfields SET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."',credits='0', timeoffset='9999'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."',lastactivity='".$this->base->time."',lastpost='0', lastsendmail='0'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_profile SET uid='$uid'");
$this->db->query("INSERT INTO discuz.zyb_common_member_field_forumSET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_field_home SET uid='$uid'");
$this->db->query("INSERT INTOdiscuz.zyb_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0',extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0',extcredits7='0', extcredits8='0'");
return $uid;
}
Class_member.php 如果上面两种情况不可以再进行更改
//begin
//判断是否登陆成功(登陆成功会返回:用户id、用户名、密码等信息):
$user_t=uc_user_login($result["ucresult"]["username"],$result["ucresult"]["password"]);
//查询论坛中是否存在该账号
$user_inf = DB::fetch_first("SELECT * FROM".DB::table('common_member')." WHERE uid=".$uid);
//如果该账号不存在论坛用户表中且登陆成功,则将该用户的信息写入论坛用户数据中(即实现不用点击激活才能使用的缺陷)。
if(!$user_inf["uid"] AND $user_t[0]>0){
DB::insert('common_member', array(
'uid' => $uid,
'username' => $result['ucresult']['username'],
'password' => md5(random(10)),
'email' => $result['ucresult']['email'],
'adminid' => 0,
'groupid' =>$this->setting['regverify'] ? 8 : $this->setting['newusergroupid'],
'regdate' => TIMESTAMP,
'credits' => $init_arr[0],
'timeoffset' => 9999
));
DB::insert('common_member_status', array(
'uid' => $uid,
'regip' => $_G['clientip'],
'lastip' => $_G['clientip'],
'lastvisit' => TIMESTAMP,
'lastactivity' => TIMESTAMP,
'lastpost' => 0,
'lastsendmail' => 0
));
DB::insert('common_member_profile', array('uid' =>$uid));
DB::insert('common_member_field_forum', array('uid' =>$uid));
DB::insert('common_member_field_home', array('uid' =>$uid));
DB::insert('common_member_count', array(
'uid' => $uid,
'extcredits1' => $init_arr[1],
'extcredits2' => $init_arr[2],
'extcredits3' => $init_arr[3],
'extcredits4' => $init_arr[4],
'extcredits5' => $init_arr[5],
'extcredits6' => $init_arr[6],
'extcredits7' => $init_arr[7],
'extcredits8' => $init_arr[8]
));
manyoulog('user', $uid, 'add');
$result['member'] = DB::fetch_first("SELECT * FROM".DB::table('common_member')." WHERE uid='$uid'");
$result['status'] = 1;
}
//end