OpenFire 屏蔽注册

来源:互联网 发布:java面向对象思维导图 编辑:程序博客网 时间:2024/05/01 00:55

首先你得会自己拓展插件,这里就不多说了。各种百度,一搜一大片,,,
进入正题,代码如下,仅供参考,亲测没问题:
package org.jivesoftware.openfire.plugin;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Date;

import org.dom4j.Element;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.jivesoftware.openfire.user.DefaultUserProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.IQ;
import org.xmpp.packet.Packet;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
import org.jivesoftware.util.StringUtils;

public class Sample implements PacketInterceptor,Plugin
{

private static final Logger Log = LoggerFactory.getLogger(DefaultUserProvider.class);private XMPPServer server;//以下对ofProperty表的操作,都是用来配置后台,只需要配置数据库连接即可 private static final String INSERT_ofProperty =        "INSERT INTO ofProperty (name,propValue)" +        "VALUES (?,?)";private static final String PropValue =        "SELECT propValue FROM ofProperty  WHERE `name`='provider.user.className '";private static final String UPDATE_ofProperty ="UPDATE      ofProperty SET propValue=? WHERE name=?";         //用户表添加字段  根据个人需求   private static final String Add_UserID =        "alter table ofuser add userid  varchar(50)";@Overridepublic void initializePlugin(PluginManager manager, File pluginDirectory) {    // TODO Auto-generated method stub    server=XMPPServer.getInstance();    InterceptorManager.getInstance().addInterceptor(this);    System.out.println("连接成功"+server.getServerInfo());     //provider.user.className     这里只需要把表中对应value换成自己插件中重写的注册方法就可以了,,,当然我这么做的目的是想通过平台原有的服务端,注册成功后再走一遍openfire注册,保证双方数据同步。这个地方各有所需,根据自己的需要配置吧。    String name="provider.user.className";    String propValue="org.jivesoftware.openfire.plugin.PaasRegistered";    if (getPropValue().equals(""))     {        inisertProperty(name,propValue);    }    else     {        System.out.print("存在 字段"+getPropValue());        UpdateProperty(propValue,name);    }    //这个地方本来是需要验证数据库知否存在所要添加的字段,没办法,我太懒,所以就和上面换了一下位置,亲测无误。哈哈    addUserid();}//插入userid  -- ofuserpublic void addUserid() {     Connection con = null;        PreparedStatement pstmt = null;        try {            con = DbConnectionManager.getConnection();            pstmt = con.prepareStatement(Add_UserID);            pstmt.execute();        }        catch (SQLException e) {            throw new RuntimeException(e);        }        finally {            DbConnectionManager.closeConnection(pstmt, con);        }   }//插入ofPropertypublic void inisertProperty(String name,String propValue) {    Connection con = null;    PreparedStatement pstmt = null;    try {        con = DbConnectionManager.getConnection();        pstmt = con.prepareStatement(INSERT_ofProperty);        pstmt.setString(1, name);        pstmt.setString(2, propValue);        pstmt.execute();    }    catch (SQLException e) {        throw new RuntimeException(e);    }    finally {        DbConnectionManager.closeConnection(pstmt, con);    }   }//修改ofPropertypublic void UpdateProperty(String propValue,String name ) {    Connection con = null;    PreparedStatement pstmt = null;    try {        con = DbConnectionManager.getConnection();        pstmt = con.prepareStatement(UPDATE_ofProperty);        pstmt.setString(1, propValue);        pstmt.setString(2,name );

// pstmt.execute();
pstmt.executeUpdate();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
finally {
DbConnectionManager.closeConnection(pstmt, con);
}
}
//获取ofProperty–propValue
public String getPropValue() {
String str = “”;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(PropValue);
rs = pstmt.executeQuery();
if (rs.next()) {
str = rs.getNString(1);
}
}
catch (SQLException e) {
Log.error(e.getMessage(), e);
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return str;
}

@Override public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException{    System.out.println("接收到的消息内容:"+packet.toXML());      IQ qq=(IQ)packet;    Element childElement = qq.getChildElement();    String namespace = childElement.getNamespaceURI();    //这里我就用了这个粗暴的方法干掉了原有的注册,自己可以用spark测试就知道了。  if(namespace.indexOf("register") != -1)      {           throw new PacketRejectedException("禁止");    }}@Overridepublic void destroyPlugin() {    // TODO Auto-generated method stub    System.out.println("Sample.destroyPlugin() 停止");}

}
以上仅供参考,本人转JAVA不久,代码写的不够严谨,质量较差,勿喷。如有好的方式方法,请大家多多指点,谢谢。

————————————————————–小白——————————————————————————

2 0