首先你得会自己拓展插件,这里就不多说了。各种百度,一搜一大片,,,
进入正题,代码如下,仅供参考,亲测没问题:
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不久,代码写的不够严谨,质量较差,勿喷。如有好的方式方法,请大家多多指点,谢谢。
————————————————————–小白——————————————————————————