openfire中添加好友发送验证消息
(2015-01-27 10:34:00)
openfire中添加好友没有提供验证消息的功能,为此,我们对其进行了添加。这个需要服务端和客户端协同配合。
if(packet.toString().contains("urn:rndchina:validationmessage")){
Element element = packet.getElement().element("x");
String body = element.elementText("body");
JID from = packet.getFrom();
String to = packet.getElement().element("query").element("item").attributeValue("jid");
ValidateMessageStore message = new ValidateMessageStore();
message.addOrUpdateMessage(from.getNode(), to, body);
}
session.process(createSubscribePresence(item.getJid(),
session.getAddress().asBareJID(), true));
} else if (item.getRecvStatus() == RosterItem.RECV_UNSUBSCRIBE) {
session.process(createSubscribePresence(item.getJid(),
session.getAddress().asBareJID(), false));
}
if (item.getSubStatus() == RosterItem.SUB_TO
|| item.getSubStatus() == RosterItem.SUB_BOTH) {
presenceManager.probePresence(session.getAddress(), item.getJid());
}
public Presence createSubscribePresence(JID senderAddress, JID targetJID, boolean isSubscribe) {
Presence presence = new Presence();
presence.setFrom(senderAddress);
presence.setTo(targetJID);
//判断其有没有验证信息
ValidateMessageStore validateStore = new ValidateMessageStore();
String body = validateStore.getMessage(senderAddress.asBareJID().getNode(),targetJID.asBareJID().toString());
if(body!=null){
ValidationMessage message = new ValidationMessage(body);
presence.addExtension(message);
}
if (isSubscribe) {
presence.setType(Presence.Type.subscribe);
}
else {
presence.setType(Presence.Type.unsubscribe);
}
return presence;
}
首先在添加好友时,会发送一个IQ,一个presence。如果好友在线的话会收到presence中携带的信息,而在对方离线的情况下是收不到这个presence中携带的信息。
我们的处理方式是在IQ上同时绑定一个同样的信息。将该信息存入到数据库,同时有助于云端存储。
处理逻辑如下:
一、在IQRosterHandler.java的handleIQ(IQ packet)中对IQ进行操作。
//判断是否含有验证信息
ValidateMessageStore是一个操作数据库的类,很简单不在赘述。
二、在PresenceUpdateHandler.java中的initSession(ClientSession session)中会判断是否有申请添加好友的信息,
if (item.getRecvStatus() == RosterItem.RECV_SUBSCRIBE) {
通过以上代码会发现,如果有未处理的好友申请信息,会给当前用户发送一个presence。我们对createSubscribePresence()方法进行了改进,具体如下:
这样即便对方不在线,下次登录的时候就可以接收到添加好友的验证消息。同时也在服务器进行了相关存储。