转: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. 【Dart学习】--Dart之正则表达式相关方法总结

    一,部分属性 RegExp exp = new RegExp(r"(\w+)"); 返回正则表达式的哈希码 print(exp.hashCode); 正则表达式是否区分大小写 pr ...

  2. Springboot项目静态资源配置

    springboot项目的静态资源配置网上有好多,说的也很详细 我今天出错是自定义了一个filter,在shiro里配置的/**,自定义filter 所以一直报302

  3. inline-block空隙怎么解决

    方法一:移除空格 元素间留白间距出现的原因就是标签段之间的空格,因此,去掉HTML中的空格,自然间距就木有了.考虑到代码可读性,显然连成一行的写法是不可取的,我们可以: <div class=& ...

  4. share memory cache across multi web application

    Single instance of a MemoryCache across multiple application pools on the same server [duplicate] Yo ...

  5. react 中使用 JsBarcode 显示条形码

    import React from 'react';import JsBarcode from 'jsbarcode'; export class RefundSheet extends React. ...

  6. appium 链接真机运行时报错

    今天用appium链接真机时,碰到的第一个问题:Attempt to re-install io.appium.settings without first uninstalling.(这是日志中显示 ...

  7. HTML5: HTML5 Video(视频)

    ylbtech-HTML5: HTML5 Video(视频) 1.返回顶部 1. HTML5 Video(视频) 很多站点都会使用到视频. HTML5 提供了展示视频的标准. 检测您的浏览器是否支持 ...

  8. 7、c++版,在大学学的编程基础知识

    1.各种排序 #include<iostream> using namespace std; //-------直接插入排序 void InsertSort(ElemType A[],in ...

  9. 关闭禁用 Redis 危险命令

    Redis 的危险命令主要有: flushdb,清空数据库 flushall,清空所有记录,数据库 config,客户端连接后可配置服务器 keys,客户端连接后可查看所有存在的键,当 redis k ...

  10. Tomcat_startup

    @echo off echo 执行开始时间 date/t time/t echo *********************************************** echo 清除Tomc ...