(转)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 递归函数的三种实现方式
递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...
随机推荐
- sql server 基础语法4 实践练习+子查询
drop table class create table class ( classId ) primary key not null, cName ) ) insert into class ', ...
- JdbcTemplate 的oracle分页
@Autowired private JdbcTemplate jd; int ps1=Integer.valueOf(pageSize); int cp1=Integer.valueOf(currP ...
- python主要探索函数
在数据分析中,Python的主要探索函数 Python中主要用于书探索的是pandas(数据分析)和matplotlib(数据可视化).其中pandas提供了大量的数据探索的工具与数据相关的函数,这些 ...
- Oracle执行计划不走索引的原因总结
在Oracle数据库操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一下. 不走索引大体有以下几个原 ...
- C# 网络编程 TcpListener
1.服务断代码 public partial class Server : Form { private bool lk = true; public Server() { InitializeCom ...
- im开发总结:netty的使用
最近公司在做一个im群聊的开发,技术使用得非常多,各种代码封装得也是十分优美,使用到了netty,zookeeper,redis,线程池·,mongdb,lua,等系列的技术 netty是对nio的一 ...
- tomcat+nginx 单机部署多应用LINUX
1.首先虚拟机上安装nginx 和tomcat,这里安装就不赘述了. nginx安装可以参考https://www.linuxidc.com/Linux/2016-09/134907.htm,相关配置 ...
- Mac下homebrew的安装与卸载
mac系统常用的软件安装工具就是homebrew 个人认为通过brew安装比较简单,下面介绍下如何安装 安装和卸载homebrew 安装 /usr/bin/ruby -e "$(curl - ...
- 停止node进程
运行vue-cli项目的时候经常出现端口号占用,npm run dev报错的信息, 此时可通过任务管理器粗暴的杀死node进程,也可以通过cmd检测占用某个端口的程序,进而杀死该进程,步骤如下: 1. ...
- JS对象 屏幕分辨率的高和宽 window.screen 对象包含有关用户屏幕的信息。 1. screen.height 返回屏幕分辨率的高 2. screen.width 返回屏幕分辨率的宽
屏幕分辨率的高和宽 window.screen 对象包含有关用户屏幕的信息. 1. screen.height 返回屏幕分辨率的高 2. screen.width 返回屏幕分辨率的宽 注意: 1.单位 ...