OpenFire 屏蔽注册

首先你得会自己拓展插件,这里就不多说了。各种百度,一搜一大片,,,
进入正题,代码如下,仅供参考,亲测没问题:
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)";

@Override
public 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  -- ofuser
public 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);
        }   
}

//插入ofProperty
public 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);
    }   
}
//修改ofProperty
public 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("禁止");
    }

}
@Override
public void destroyPlugin() {
    // TODO Auto-generated method stub
    System.out.println("Sample.destroyPlugin() 停止");

}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值