流水不争先,争的是滔滔不绝

openfire学习之八 通过http方式向openfire客户端发信息

openfire 云聊IM 1554℃

需求:

通过http方式,向openfire客户端发信息(非XMPP协议)

openfire发送信息(只发信息)通常使用smack等XMPP客户端来实现,但有时有些客户端不想使用smack,如android、web或非java客户端。此时可以给openfire服务器开一个接口,并且能通过http或service方式调用,这样就可以不用考虑客户端的类型了。当然,这只是做最简单的发送信息

实现方式:

给openfire服务器添加一个插件,并注册为servlet和Component,在servlet中使用ComponentManager给客户端发送信息。

目录结构:

1:在openfire的src\plugins目录下创建sendmsg目录,在sendmsg目录下创建左上图文件结构,并将src\plugins\sendmsg\src\java应用为源目录,如右上图所示。

2:实现SendMsgPlugin,继承Plugin类,并重写initializePlugin()及destroyPlugin(),方法体为空。

3:在plugin.xml文件中添加以下代码,注册插件

<?xml version="1.0" encoding="UTF-8"?>  
<plugin>  
    <name>sendmsgPlugin</name>  
    <class>com.hzaccp.sendmsg.plugin.SendMsgPlugin</class>  
    <description></description>  
</plugin> 

4:实现SendMsgServlet类,继承HttpServlet类及实现Component接口。

重写init(ServletConfig config)方法[不是init()方法],在方法体中初始化

AuthCheckFilter.addExclude(SERVICE_NAME);//给验证器添加排除的路径  
componentManager = ComponentManagerFactory.getComponentManager();//注册组件  
componentManager.addComponent(COMPONENTNAME, this);  

重写doGet()方法,在方法体中处理业务,这里发送信息

//在些之前应该做验证逻辑  
Message msg = new Message();  
msg.setBody("mess body");  
msg.setFrom("admin" + domain);//发信人  
msg.setTo("service" + domain);//接收人  
msg.setType(Message.Type.chat);//为聊天信息  
componentManager.sendPacket(this, msg);//发送  

重写destroy()方法,释放内存

componentManager.removeComponent(COMPONENTNAME);  
componentManager = null;  
AuthCheckFilter.addExclude(SERVICE_NAME);  

5:在web-custom.xml文件中注册servlet

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">  
<web-app>  
    <servlet>  
        <servlet-name>sendmsgservlet</servlet-name>  
        <servlet-class>com.hzaccp.sendmsg.plugin.SendMsgServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>sendmsgservlet</servlet-name>  
        <url-pattern>/sendservlet</url-pattern>  
    </servlet-mapping>  
</web-app>  

6:修改src\web\WEB-INF\decorators.xml文件,添加排除过滤路径

<pattern>/plugins/sendmsg/sendservlet*</pattern>  

7:发布后访问http://127.0.0.1:9090/plugins/sendmsg/sendservlet

关键点:

1:目录结构,这关系到插件能否部署成功

2:SendMsgServlet类初始化时,需要给验证器添加排除的路径[AuthCheckFilter.addExclude(SERVICE_NAME);],否则访问时需要登录。

3:如果想在servlet中只输出自已的内容,那第6点是很有必要的,否则会将你的内容嵌入到openfire自带的框架中。如果已在SendMsgServlet类初始化时添加排除路径,而没完成上述第6点,则会出空指针。

4:在SendMsgServlet的doGet()或doPost()中,应该加上验证,否则任何人都可以向任何人发信息。

附:SendMsgServlet 完整源码

package com.cvte.sendfile.openfire.plugin;  
  
/**  
 * com.hzaccp.sendmsg.plugin.SendMsgServlet  
 * */  
  
import java.io.IOException;  
import java.io.PrintWriter;  
  
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.smackx.filetransfer.FileTransferManager;  
import org.xmpp.component.Component;  
import org.xmpp.component.ComponentException;  
import org.xmpp.component.ComponentManager;  
import org.xmpp.component.ComponentManagerFactory;  
import org.xmpp.packet.JID;  
import org.xmpp.packet.Message;  
import org.xmpp.packet.Packet;  
  
public class SendFileServlet extends HttpServlet implements Component {  
    private static final long serialVersionUID = -5404916983906926869L;  
  
    private static final String SERVICE_NAME = "sendMassg/sendservlet";//服务名  
    private ComponentManager componentManager;//组件管理  
    private static final String COMPONENTNAME = "sendservlet";//组件名  
    private static final String domain = "@cvt1397";//服务器域名  
  
    @Override  
    public void init(ServletConfig config) throws ServletException {  
        super.init(config);  
  
        //给验证器添加排除的路径  
        AuthCheckFilter.addExclude(SERVICE_NAME);  
        System.out.println("aaaaaaaaaa");  
        //注册组件  
        componentManager = ComponentManagerFactory.getComponentManager();  
        try {  
            componentManager.addComponent(COMPONENTNAME, this);  
        } catch (Exception err) {  
            err.printStackTrace();  
        }  
    }  
  
    /**  
     * servlet的get方法,在这里发送信息  
     * */  
    @Override  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        try {  
            String massg=request.getParameter("massg");  
            //构建信息  
            Message msg = new Message();  
            msg.setBody(massg);  
            msg.setFrom("cc" + domain);//发信人  
            msg.setTo("aa" + domain);//接收人  
            msg.setType(Message.Type.chat);//为聊天信息  
  
            componentManager.sendPacket(this, msg);//发关  
              
              
        } catch (ComponentException err) {  
            err.printStackTrace();  
        }  
  
        response.setContentType("text/html;setchar=UTF-8");  
        PrintWriter out = new PrintWriter(response.getOutputStream());  
        out.print("GET Methodx");  
        out.flush();  
    }  
  
    /**  
     * servlet的post方法,直接调用get方法  
     * */  
    @Override  
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        doGet(request, response);  
    }  
  
    @Override  
    public void destroy() {  
        super.destroy();  
        if (componentManager != null) {  
            try {  
                componentManager.removeComponent(COMPONENTNAME);  
            } catch (Exception err) {  
                err.printStackTrace();  
            }  
        }  
        componentManager = null;  
        AuthCheckFilter.addExclude(SERVICE_NAME);  
    }  
  
    @Override  
    public String getDescription() {  
        return "no Description..";  
    }  
  
    @Override  
    public String getName() {  
        return COMPONENTNAME;  
    }  
  
    @Override  
    public void initialize(JID jid, ComponentManager comManager) throws ComponentException {  
  
    }  
  
    @Override  
    public void processPacket(Packet arg0) {  
  
    }  
  
    @Override  
    public void shutdown() {  
    }  
  
    @Override  
    public void start() {  
    }  
} 
版权声明:部分文章、图片等内容为用户发布或互联网整理而来,仅供学习参考。如有侵犯您的版权,请联系我们,将立刻删除。
点击这里给我发消息