说明
内部组件就是openfire的插件,因为它必须和openfire所在的进程一起运行,被openfire动态加载,所以叫做openfire插件。
一般来说,都是通过admin管理界面进行导入
添加插件
删除插件
项目结构
- src
- plugin.xml
- changelog.html:发布日志,记录插件各版本的变化情况,就是纯HTML,方便阅读即可
- readme.html:项目描述
- logo_large.gif:插件大logo
- logo_small.gif :插件小logo
- pom.xml:打包的项目
src
不用多说,自然是源码路径,内部就是一个web项目,内部包含java:资源代码,resources:项目配置资源等,webapp:web服务资源、服务配置web.xml等。
最为重要的是assembly,其重要配置项目的xml信息,是否见插件jar的关键
assembly.xml
openfire-plugin-ms-filter
jar
false
true
org.igniterealtime.openfire.ofmeet:videobridge
false
true
lib-videobridge
true
org.igniterealtime.openfire.ofmeet:offocus
false
true
lib-jicofo
true
org.igniterealtime.openfire.ofmeet:ofgasi
false
true
lib-jigasi
${project.build.sourceDirectory}/../..
*.gif
*.png
lib/**
${project.build.sourceDirectory}/../..
true
*.html
plugin.xml
${project.build.sourceDirectory}/..
database/**
i18n/**
web/**
**/*.jsp
i18n/**/*.properties
web/**/*.xml
web/**/*.html
web/**/*.properties
${project.build.sourceDirectory}/..
true
i18n/**/*.properties
web/**/*.xml
web/**/*.html
web/**/*.properties
web/WEB-INF/web.xml
web/WEB-INF
${project.build.directory}
web.xml
classes
classes
true
**/*.xml
**/*.properties
classes
classes
false
**/*.xml
**/*.properties
lib
true
org.igniterealtime.openfire.ofmeet:videobridge
org.igniterealtime.openfire.ofmeet:offocus
org.igniterealtime.openfire.ofmeet:ofgasi
true
true
plugin.xml
是最重要的插件的配置文件。这个文件非常重要,openfire需要读取插件信息,例如插件的启动类是哪一个,需要在plugin.xml中定义
标签 | 说明 |
---|---|
class | 插件的启动类,也可以理解为插件的main函数 |
name | 插件的名字 |
description | 插件功能描述字段 |
author | 作者名称 |
version | 插件版本 |
date | 插件书写的日期,这个自己知道就可以了 |
url | 插件的官网 |
minServerVersion | openfire的最小版本 |
minJavaVersion | JDK最小版本 |
com.demo.plugin.MessageFilterPlugin
文本消息过滤插件
过滤一些敏感词、非法词汇
机制的我
${project.version}
06/06/2019
4.3.2
1.8
实战
1、在父项目中的plugin模块下,创建子项目,然后按照上面的结构,创建项目按照上面结构
2、复制assembly.xml
3、然后编写主要业务类
4、补上pom的配置
一个小插件项目就完成了,然后就是打包命令,在父项目目录下
mvn verify -f plugins/openfire-plugin-ms-filter/pom.xml
最后打包出来的项目openfire-plugin-ms-filter.jar
,通过上面添加插件的步骤,通过admin界面进行添加。
下面粘贴部分需要用到的项目的代码和xml。
业务类
package com.demo.plugin;
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 java.io.File;
public class MessageFilterPlugin implements Plugin, PacketInterceptor {
private static final Logger Log = LoggerFactory.getLogger(MessageFilterPlugin.class);
// 消息拦截器
private InterceptorManager interceptorManager;
// 插件初始化函数
@Override
public void initializePlugin(PluginManager pluginManager, File file) {
// 将当前插件加入到消息拦截管理器(interceptorManager )中,当消息到来或者发送出去的时候,会触发本插件的interceptPacket方法。
interceptorManager = InterceptorManager.getInstance();
interceptorManager.addInterceptor(this);
}
// 插件销毁函数
@Override
public void destroyPlugin() {
// 当插件被卸载的时候,主要通过openfire管理控制台卸载插件时,被调用。注意interceptorManager的addInterceptor和removeInterceptor需要成对调用。
interceptorManager.removeInterceptor(this);
}
// 插件拦截处理函数
@Override
public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException {
// incoming表示本条消息刚进入openfire。processed为false,表示本条消息没有被openfire处理过。这说明这是一条处女消息,也就是没有被处理过的消息。
if (incoming && processed == false) {
// packet可能是IQ、Presence、Message,这里当packet是message的时候,进行处理。
if (packet instanceof Message) {
// 将packet强制转换为Message
Message msg = (Message) packet;
// 取得message中的body内容,就是消息正文
String body = msg.getBody();
// 如果内容中包含fuck,则拒绝处理消息
if (body != null && body.contains("fuck")) {
// 这里通过抛出异常的方式,来阻止程序流程继续执行下去。
PacketRejectedException rejectedException = new PacketRejectedException();
// 设置返回信息
rejectedException.setRejectionMessage("信息发送失败,包含侮辱性词语");
throw rejectedException;
}
}
}
}
}
配置pom
4.0.0
org.igniterealtime.openfire
plugins
4.3.2
com.openfire.plugin.demo
openfire-plugin-ms-filter
1.0
src/java
src/test
org.apache.maven.plugins
maven-assembly-plugin
2.6
make-assembly
package
single
false
${project.artifactId}
false
src/assembly/ms-filter-plugin-assembly.xml
org.eclipse.jetty
jetty-jspc-maven-plugin
9.2.14.v20151106
${project.build.sourceDirectory}/../java
${project.build.sourceDirectory}/../java/WEB-INF/web.xml
jspc
jspc
org.jivesoftware.openfire.plugin.${project.artifactId}
org.igniterealtime.openfire
xmppserver
${openfire.version}
org.apache.felix
maven-bundle-plugin
3.0.0
true