(转)openfire插件开发(三)通过http方式向openfire客户端发信息
转: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文件中添加以下代码,注册插件
- <?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()中,应该加上验证,否则任何人都可以向任何人发信息。
5:最后ant build一下,生成插件
下载路径:
http://download.csdn.net/detail/hzaccp3/6962851
(转)openfire插件开发(三)通过http方式向openfire客户端发信息的更多相关文章
- openfire插件开发之完美开发
http://redhacker.iteye.com/blog/1919329 一.说在前面 在继上篇Openfire3.8.2在eclipse中Debug方式启动最简单的方式后,我研究了openfi ...
- (转)openfire插件开发(一)
转:http://blog.csdn.net/lovexieyuan520/article/details/37774909 1. 在上一篇博文中,我介绍了Openfire3.9.3源代码导入ecli ...
- 通过三个DEMO学会SignalR的三种实现方式
一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...
- Hive metastore三种配置方式
http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...
- django 模板语法和三种返回方式
模板 for循环 {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} if语句 ...
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
- Map三种遍历方式
Map三种遍历方式 package decorator; import java.util.Collection; import java.util.HashMap; import java.util ...
- php 递归函数的三种实现方式
递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...
随机推荐
- Network基础(四):MAC地址表及邻居信息查看、配置接口速率及双工模式、配置交换机管理IP
一.MAC地址表及邻居信息查看 目标: 本例要求为修改计算机名并加入工作组: 查看交换机MAC地址表 查看CISCO设备邻居信息 方案: 网络拓扑,如下图所示. 步骤: 步骤一:查看交换机sw1的ma ...
- Linux CentOS-7.4-x86_64(原版) 百度网盘下载
因为CentOS-7-x86_64-DVD-1804.iso 镜像文件4.16G,超出了上传百度网盘的单个文件大小限制(4G), 所以这里先现将ISO镜像文件压缩成RAR包,然后上传网盘. 使用的话, ...
- Nginx加载多个CPU核心,worker_cpu_affinity
配置Nginx多核CPU,worker_cpu_affinity使用方法和范例1. 2核CPU,开启2个进程 worker_processes 2;worker_cpu_affinity 01 10; ...
- SAS创建和使用索引(SAS INDEX)
一.概述 在合并数据集的时候,可以使用DATA步,但使用DATA 步时需要对KEY VALUE 排序,且KEY VALUE 的名字也必须一致:也可以用PROC SQL ,不需要进行上述排序.重命名的步 ...
- java.lang.ArrayIndexOutOfBoundsException 异常分析及解决
参考:http://blog.csdn.net/javaeeteacher/article/details/4485834 这是一个非常常见的异常,从名字上看是数组下标越界错误,解决方法就是查看为什么 ...
- 262K Color
262K色=2^18=262144色. 320*240是指屏幕分辨率. 你可以理解为一块黑板,这款黑板宽是3.2M,长是2.4米,以1cm为最小单位,整个黑板被分为320*240个小格子,这个小格子里 ...
- 基于MFC的Media Player播放器的制作介绍
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 因为这次多媒体课程设计做一个基于MFC的播放器,因为本人实力太菜,需要播放音乐或视频文件时候,自己写不出解码 函数,所以准备使用第三方多媒 ...
- php token的生成和使用
原文连接:http://ukagaka.github.io/php/2018/05/08/JWT.html 1. 为什么要使用tokent进行登录 前后端分离或者为了支持多个web应用,那么原来的co ...
- Java开发最常犯的10个错误,打死都不要犯!
原文:http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 译文:cnblogs.com/chenpi/p ...
- FrameWork内核解析之布局加载与资源系统(三)
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍布局加载与资源系统: [ LayoutM ...