openfire中添加好友发送验证消息

来源:互联网 发布:android官方文档 知乎 编辑:程序博客网 时间:2024/06/02 12:47

openfire中添加好友发送验证消息

 (2015-01-27 10:34:00)
转载
标签: 

股票

分类: IM研究
openfire中添加好友没有提供验证消息的功能,为此,我们对其进行了添加。这个需要服务端和客户端协同配合。
首先在添加好友时,会发送一个IQ,一个presence。如果好友在线的话会收到presence中携带的信息,而在对方离线的情况下是收不到这个presence中携带的信息。
我们的处理方式是在IQ上同时绑定一个同样的信息。将该信息存入到数据库,同时有助于云端存储。
处理逻辑如下:
一、在IQRosterHandler.java的handleIQ(IQ packet)中对IQ进行操作。
//判断是否含有验证信息
            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);
            }
ValidateMessageStore是一个操作数据库的类,很简单不在赘述。
二、在PresenceUpdateHandler.java中的initSession(ClientSession session)中会判断是否有申请添加好友的信息,
if (item.getRecvStatus() == RosterItem.RECV_SUBSCRIBE) {
                        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());
                    }
通过以上代码会发现,如果有未处理的好友申请信息,会给当前用户发送一个presence。我们对createSubscribePresence()方法进行了改进,具体如下:
 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;
    }
这样即便对方不在线,下次登录的时候就可以接收到添加好友的验证消息。同时也在服务器进行了相关存储。

原创粉丝点击