如何使用XMPP在Openfire插件中使用PacketInterceptor将自定义XML元素添加到Message

时间:2015-06-21 08:50:43

标签: openfire

我想将自定义XML添加到传入的消息包中。为了实现插件实现的一部分,我编写了一个PacketInterceptor,它拦截了消息并添加了一个扩展。直到这一点,一切都很好但是当接收者收到此消息时,存储在自定义xml中的信息被条带化。仅显示带有名称空间的xml元素。

传入的消息是常规短信,如下所示 -

<message to='18@mcasax01/SomeResource' from='myroom@conference.mcasax01/testbot2' id='63S0G-27' type='groupchat'>

     <body>Hi</body>

</message>

当我向此邮件正文添加自定义XML时,在PacketInterceptor日志中添加XML后,它看起来如下所示 -

<message to='18@mcasax01/SomeResource' from='myroom@conference.mcasax01/testbot2' id='63S0G-27' type='groupchat'>

     <body>Hi</body>

     <data value="imgURL1"/>

</message>

但是当接收方收到此消息时,数据中的value属性会被条带化,并且参与者会收到以下消息 -

<message to='17@mcasax01/SomeResource' from='myroom@conference.mcasax01/testbot2' id='63S0G-27' type='groupchat'>

     <body>Hi</body>

     <data xmlns='jabber:client'></data>

</message>

请注意,文本和属性都会从数据XML节点中删除。

以下是供您参考的java代码段

public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException {

    // Some code

    Message messagePacket = (Message) packet;
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement("data");
    Element root1 = root.addAttribute("value", "imgURL1");
    PacketExtension pe = new PacketExtension(root1);
    messagePacket.addExtension(pe);

}

1 个答案:

答案 0 :(得分:0)

实现interceptPacket方法时,需要注意不同的参数。相同的XMPP数据包将被拦截多次。确保您只拦截未处理的传入数据包。您可以通过在传递给方法的布尔值上写条件来完成此操作。

至于确保正确创建XML,您应该在Message对象上使用addChildElement方法而不是addExtension方法。 我之前已成功使用addChildElement方法在XMPP消息发送到接收方之前添加时间戳。 addChildElement的API非常简单,可以避免您创建一个全新的文档。