因?yàn)楣ぷ餍枰隽艘粋€聊天歷史記錄的插件,一開始找國外的插件,不好用,需要java客戶端插件,而且始終不能夠?qū)⒘奶靸?nèi)容保存在服務(wù)器的數(shù)據(jù)庫上。
鑒于此,自己寫了一個聊天記錄的插件,可以客戶端調(diào)用,通過訪問URL,其實(shí)是一個servlet地址,也可以通過頁面來查看聊天的歷史記錄。
插件的下載地址:http://download.csdn.net/detail/dragonrxl/4871601
是用的Mysql的數(shù)據(jù)庫,其他數(shù)據(jù)庫我沒測試,大家可以試一下。
具體使用很簡單,把插件放到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;
}
}
希望對大家有幫助,這個可以直接用,代碼都有了,就不用我解釋了。這個是通用的,后期還需要我自己根據(jù)自己需要改一些東西,改完就不通用啦,所以先拿出來記錄下來啦。