转:http://blog.csdn.net/hzaccp3/article/details/19964655

需求:
  通过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文件中添加以下代码,注册插件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <plugin>
  3. <name>sendmsgPlugin</name>
  4. <class>com.hzaccp.sendmsg.plugin.SendMsgPlugin</class>
  5. <description></description>
  6. </plugin>

  4:实现SendMsgServlet类,继承HttpServlet类及实现Component接口。
    • 重写init(ServletConfig config)方法[不是init()方法],在方法体中初始化

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

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

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

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

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

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

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

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

  1. <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()中,应该加上验证,否则任何人都可以向任何人发信息。

5:最后ant build一下,生成插件
 下载路径:
http://download.csdn.net/detail/hzaccp3/6962851

(转)openfire插件开发(三)通过http方式向openfire客户端发信息的更多相关文章

  1. openfire插件开发之完美开发

    http://redhacker.iteye.com/blog/1919329 一.说在前面 在继上篇Openfire3.8.2在eclipse中Debug方式启动最简单的方式后,我研究了openfi ...

  2. (转)openfire插件开发(一)

    转:http://blog.csdn.net/lovexieyuan520/article/details/37774909 1. 在上一篇博文中,我介绍了Openfire3.9.3源代码导入ecli ...

  3. 通过三个DEMO学会SignalR的三种实现方式

    一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...

  4. Hive metastore三种配置方式

    http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...

  5. django 模板语法和三种返回方式

    模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...

  6. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  7. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  8. Map三种遍历方式

    Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...

  9. php 递归函数的三种实现方式

    递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...

随机推荐

  1. tp3.2控制器返回时关闭子窗口刷新父页面

    我的项目操作都是在子页面弹窗中执行,当我操作成功或失败时,都要关闭当前子窗口,刷新父页面: $this->assign('jumpUrl',"javascript:window.par ...

  2. 2.zabbix自定义模板

    zabbix自定义模板 zbx_base_templates.xml <?xml version="1.0" encoding="UTF-8"?> ...

  3. 【运维】使用Serv-U搭建FTP服务器

    1.先安装好Serv-U,并作为系统服务安装 2.打开Serv-U,新建一个域 3.添加用户 4.解决阿里云专有网络的一个问题 遇到一个情景:需要使用Serv-U进行FTP更新软件,其中使用PASV的 ...

  4. uuid 去中心化的唯一性

    A Universally Unique IDentifier (UUID) URN Namespace https://tools.ietf.org/html/rfc4122.html A UUID ...

  5. js一些if语句判断条件为fasle的情况

    js一些if语句判断条件为fasle的情况 之前有写一个if判断条件产生的bug,当时写逻辑处理数据是在后台给接口之前,所以自己拟定了字段值为number类型的0或者1来进行判断,最后接口出来的时候是 ...

  6. 96、搬家到csdn

    大家好: 今天开始会将所有的博客搬家到CSDN,以后请参考CSDN上的博客:http://blog.csdn.net/u012416045 谢谢 维真

  7. 大型项目必备IPC之其他IPC方式(二)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680IPC的6种方式IPC是Inter-Process Communicati ...

  8. 16-python基础-字典

    1.字典的定义 dictionary(字典)是除列表以外python之中最灵活的数据类型. 字典同样可以存储多个数据. 通常用于存储一个物体的相关信息. 和列表的区别 列表是有序的对象集合 字典是无序 ...

  9. shiro安全框架的使用流程

    最近学了shiro安全框架流程,在这里梳理一下shiro的工作流程和一些代码,方便以后使用的时候,能快速找到对应的代码. 要使用这个shiro框架,还要新建两张表 t_authority(权限表)和t ...

  10. vue 动态绑定height以及v-if、v-else的使用

    动态绑定height: :style="{height: slideHeight+'rem'}" slideHeight: 2 如果需要计算来得到高度,如: <p :styl ...