因为工作需要做了一个聊天历史记录的插件,一开始找国外的插件,不好用,需要java客户端插件,而且始终不能够将聊天内容保存在服务器的数据库上。
鉴于此,自己写了一个聊天记录的插件,可以客户端调用,通过访问URL,其实是一个servlet地址,也可以通过页面来查看聊天的历史记录。
插件的下载地址:http://download.csdn.net/detail/dragonrxl/4871601
是用的Mysql的数据库,其他数据库我没测试,大家可以试一下。
具体使用很简单,把插件放到openfire的安装目录下的plugins下面,然后重启openfire,就可以看到了
在openfire的页面里面可以查看聊天记录哈
废话少说,直接上代码:
首先是插件类
package org.jivesoftware.openfire.plugin;
import java.io.File;
import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;
import org.jivesoftware.openfire.interceptor.InterceptorManager;
public class ChatPlugin implements Plugin {
private chatInterceptor chatInter = null;
@Override
public void destroyPlugin() {
// TODO Auto-generated method stub
if(chatInter != null)
{
InterceptorManager.getInstance().removeInterceptor(chatInter);
}
}
@Override
public void initializePlugin(PluginManager manager, File pluginDirectory) {
chatInter = new chatInterceptor();
InterceptorManager.getInstance().addInterceptor(chatInter);
}
}
package org.jivesoftware.openfire.plugin;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.openfire.interceptor.PacketInterceptor;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.session.Session;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
import org.xmpp.packet.Message.Type;
public class chatInterceptor implements PacketInterceptor{
private static final String CREATE_CHATMESSAGE_ITEM =
"INSERT INTO ofChatHistory (fromJID, toJID, message, messagetime) " +
"VALUES (?, ?, ?, ?)";
private static Connection con = null;
@Override
public void interceptPacket(Packet packet, Session session,
boolean incoming, boolean processed) throws PacketRejectedException {
// TODO Auto-generated method stub
if(!processed && packet instanceof Message)
{
if(incoming && Type.chat == ((Message)packet).getType())
{
PreparedStatement pstmt = null;
try {
if(con == null || con.isClosed())
con = (Connection) DbConnectionManager.getConnection();
pstmt = (PreparedStatement) con.prepareStatement(CREATE_CHATMESSAGE_ITEM);
pstmt.setString(1, ((Message)packet).getFrom().toBareJID());
pstmt.setString(2, ((Message)packet).getTo().toBareJID());
pstmt.setString(3, ((Message)packet).getBody());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ly_time = sdf.format(new java.util.Date());
pstmt.setString(4, ly_time);
pstmt.executeUpdate();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
DbConnectionManager.closeConnection(pstmt, con);
con = null;
}
finally {
}
}
}
}
}
package org.jivesoftware.openfire.plugin.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jivesoftware.admin.AuthCheckFilter;
import org.jivesoftware.database.DbConnectionManager;
public class chatRecordServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public chatRecordServlet() {
// TODO Auto-generated constructor stub
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
super.init(servletConfig);
AuthCheckFilter.addExclude("chatRecord/history");
}
@Override
public void destroy() {
super.destroy();
AuthCheckFilter.removeExclude("chatRecord/history");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String fromJid = request.getParameter("fromjid");
String toJid = request.getParameter("tojid");
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<result>");
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = (Connection) DbConnectionManager.getConnection();
pstmt = (PreparedStatement) con.prepareStatement("select * from ofchathistory "
+ "where (fromJID = ? and toJID = ?) OR (fromJID = ? and toJID = ?) ORDER BY id");
pstmt.setString(1, fromJid);
pstmt.setString(2, toJid);
pstmt.setString(3, toJid);
pstmt.setString(4, fromJid);
rs = (ResultSet) pstmt.executeQuery();
out.print("<messagehistory>");
while (rs.next()) {
String fromJID = rs.getString("fromJID");
String toJID = rs.getString("toJID");
String message = rs.getString("message");
String messagetime = rs.getString("messagetime");
out.print("<message>");
out.print("<fromjid>" + fromJID + "</fromjid>");
out.print("<tojid>" + toJID + "</tojid>");
out.print("<body>" + message + "</body>");
out.print("<time>" + messagetime + "</time>");
out.print("</message>");
}
out.print("</messagehistory></result>");
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
out.flush();
//out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
package org.jivesoftware.openfire.plugin.servlet;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import org.jivesoftware.database.DbConnectionManager;
import org.jivesoftware.util.JiveGlobals;
public class chatUtils {
public static String fJid = "";
public static String tJid = "";
public static Vector<Map<String, String>> getHistory(String fromJid, String toJid)
{
if(fromJid != null)
fJid = fromJid;
if(toJid != null)
tJid = toJid;
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String xmppdomain = "@" + JiveGlobals.getProperty("xmpp.domain");
Vector<Map<String, String>> vec = new Vector<Map<String, String>>();
try {
con = (Connection) DbConnectionManager.getConnection();
pstmt = (PreparedStatement) con.prepareStatement("select * from ofchathistory "
+ "where (fromJID = ? and toJID = ?) OR (fromJID = ? and toJID = ?) ORDER BY id");
pstmt.setString(1, fJid+xmppdomain);
pstmt.setString(2, tJid+xmppdomain);
pstmt.setString(3, tJid+xmppdomain);
pstmt.setString(4, fJid+xmppdomain);
rs = (ResultSet) pstmt.executeQuery();
while (rs.next()) {
String fromJID = rs.getString("fromJID");
String toJID = rs.getString("toJID");
String message = rs.getString("message");
String messagetime = rs.getString("messagetime");
Map<String, String> map = new HashMap<String, String>();
map.put("fromjid", fromJID);
map.put("tojid", toJID);
map.put("body", message);
map.put("time", messagetime);
vec.add(map);
}
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return vec;
}
public static Vector<String> getUserJid()
{
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
Vector<String> vec = new Vector<String>();
try {
con = (Connection) DbConnectionManager.getConnection();
pstmt = (PreparedStatement) con.prepareStatement("select * from ofuser");
rs = (ResultSet) pstmt.executeQuery();
while (rs.next()) {
vec.add(rs.getString("username"));
}
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
finally {
DbConnectionManager.closeConnection(rs, pstmt, con);
}
return vec;
}
}
希望对大家有帮助,这个可以直接用,代码都有了,就不用我解释了。这个是通用的,后期还需要我自己根据自己需要改一些东西,改完就不通用啦,所以先拿出来记录下来啦。