• openfire过滤脏话插件,控制消息是否发送


    参考:http://myopenfire.com/article/getarticle/9

    package com.myopenfire.plugin;
    
    import java.io.File;
    
    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;
    
    /**
     * 过滤插件:当body中有fuck时,将消息截断,不转发消息。
     *
     */
    public class MessageFilterPlugin implements Plugin ,PacketInterceptor{
    // A:生成一个日志实例,用于打印日志,日志被打印在openfire_src	argetopenfirelogs目录中
        private static final Logger Log = LoggerFactory.getLogger(MessageFilterPlugin.class);
        //B: 消息拦截器
        private InterceptorManager interceptorManager;
        
    //C: 插件初始化函数
        @Override
        public void initializePlugin(PluginManager manager, File pluginDirectory) {
            
            Log.info("MessageFilter init");
            // 将当前插件加入到消息拦截管理器(interceptorManager )中,当消息到来或者发送出去的时候,会触发本插件的interceptPacket方法。
            interceptorManager = InterceptorManager.getInstance();
            interceptorManager.addInterceptor(this);
        }
    
    //D: 插件销毁函数
        @Override
        public void destroyPlugin() {
            Log.info("MessageFilter destory");
    // 当插件被卸载的时候,主要通过openfire管理控制台卸载插件时,被调用。注意interceptorManager的addInterceptor和removeInterceptor需要成对调用。
            interceptorManager.removeInterceptor(this);
        }
    
    //E 插件拦截处理函数
        @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")){
                        // F: 这里通过抛出异常的方式,来阻止程序流程继续执行下去。
                        PacketRejectedException rejectedException =  new PacketRejectedException();
                        
                        rejectedException.setRejectionMessage("fuck is error");
                        
                        throw rejectedException;
                    }
                    
                }
            }
                
        }
        
    }
  • 相关阅读:
    【回溯】数字排列问题
    Price List
    NanoApe Loves Sequence-待解决
    【回溯】n皇后问题
    安卓 学习之旅 入门
    mysql链接 显示 error: 'Access denied for user 'root'@'localhost' (using password: NO)'
    javaweb 实战_1
    java 插件安装
    leetcode 最长有效括号
    hdu 1074 Doing Homework
  • 原文地址:https://www.cnblogs.com/shihaiming/p/6213866.html
Copyright © 2020-2023  润新知