简述:
在openfire后台插件开发过程中,抓取通信往来的packet十分重要,而openfire的设计也考虑到了这一点,除了增加扩展性的Plugin接口,他也定义了一个包拦截器接口
PacketInterceptor ,本次试验就要用到这个抓包接口。
参考:
感谢两篇博客给了明确方向,
1, http://blog.csdn.net/ibm_hoojo/article/details/8736341
2, http://blog.csdn.net/dyflovexlp/article/details/4578929
步骤:
文件夹结构:
1. 首先添加Plugin, 这里先做一个没有后台界面的Plugin
Plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<!-- Main plugin class 插件的全路径-->
<class>com.anialy.openfire.chatwrapper.ChatWrapperPlugin</class>
<!-- Plugin meta-data -->
<name>ChatWrapperPlugin</name>
<description>Chat Wrapper Plugin</description>
<author>anialy</author>
<version>1.0</version>
<date>19/04/2013</date>
<minServerVersion>3.7.2</minServerVersion>
<licenseType>gpl</licenseType>
<adminconsole>
</adminconsole>
</plugin>
2. 之后是两个Java类文件
ChatWrapperPlugin.java
package com.anialy.openfire.chatwrapper;
import java.io.File;
import java.util.List;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
import com.anialy.openfire.chatwrapper.intercepter.ChatWrapperInterceptor;
public class ChatWrapperPlugin implements Plugin {
private PacketInterceptor pktInterceptor = null;
//openfire server维护的一个拦截器集合
private InterceptorManager icpManager = InterceptorManager.getInstance();
@Override
public void initializePlugin(PluginManager manager, File pluginDirectory) {
System.out.println("安装 ChatWrapper 插件");
pktInterceptor = new ChatWrapperInterceptor();
icpManager.addInterceptor(pktInterceptor);
}
@Override
public void destroyPlugin() {
System.out.println("卸载 ChatWrapper 插件");
if(pktInterceptor != null){
icpManager.removeInterceptor(pktInterceptor);
}
}
}
ChatWrapperInterceptor.java
package com.anialy.openfire.chatwrapper.intercepter;
import java.util.List;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
public class ChatWrapperInterceptor implements PacketInterceptor {
@Override
public void interceptPacket(Packet packet, Session session,
boolean incoming, boolean processed) throws PacketRejectedException {
System.out.println("Intercept Packet ~~~~~~~~~~~~");
Packet copyPacket = packet.createCopy();
if(packet instanceof Message){
Message message = (Message) copyPacket;
// 一对一聊天,单人模式
if (message.getType() == Message.Type.chat) {
System.out.println("单人聊天信息:" + message.toXML());
// 程序执行中;是否为结束或返回状态(是否是当前session用户发送消息)
if (processed || !incoming) {
return;
}
// 群聊天,多人模式
} else if (message.getType() == Message.Type.groupchat) {
List<?> els = message.getElement().elements("x");
if (els != null && !els.isEmpty()) {
System.out.println("群聊天信息:" + message.toXML());
} else {
System.out.println("群系统信息:" + message.toXML());
}
// 其他信息
} else {
System.out.println("其他信息:" + message.toXML());
}
}
}
}
输出:
1. 当单人聊天时:发送消息“你好呀”
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
单人聊天信息:<message id="qSFSM-94" to="tester2@anialy-pc/Spark 2.6.3" from="tester1@anialy-pc/Spark 2.6.3" type="chat"><body>你好呀</body><thread>fwXwHx</thread><x xmlns="jabber:x:event"><offline/><composing/></x></message>
2. 当群聊时:
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="测试聊天室@conference.anialy-pc" type="groupchat" from="tester1@anialy-pc/Spark 2.6.3"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="tester1@anialy-pc/Spark 2.6.3" type="groupchat" from="测试聊天室@conference.anialy-pc/tester1"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="tester1@anialy-pc/Spark 2.6.3" type="groupchat" from="测试聊天室@conference.anialy-pc/tester1"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
Intercept Packet ~~~~~~~~~~~~
群聊天信息:<message id="qSFSM-77" to="tester1@anialy-pc/Spark 2.6.3" type="groupchat" from="测试聊天室@conference.anialy-pc/tester1"><body>阿斯蒂芬</body><x xmlns="jabber:x:event"><offline/><delivered/><displayed/><composing/></x></message>
小结:
有了PacketInterceptor,我们发现在服务器收发消息的时候我们可以做很多事情,比如对抓到的数据包做后台记录,又比如压缩数据包减少网络流量或是延时,这是值得继续做实验的