(转)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 递归函数的三种实现方式
递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...
随机推荐
- hdu 4826 Labyrinth(简单dp)
Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向 ...
- HTML5+CSS3特效设计集锦
20款CSS3鼠标经过文字背景动画特效 站长之家 -- HTML5特效索引 爱果果h5酷站欣赏 30个酷毙的交互式网站(HTML5+CSS3) 轻松搞定动画!17个有趣实用的CSS 3悬停效果教程 ...
- python 去除字符串两端字符串
转载:http://blog.sina.com.cn/s/blog_940224600100w8l0.html Python中的strip用于去除字符串的首位字符,同理,lstrip用于去除左边的字符 ...
- c#网络通信框架networkcomms内核解析之一 消息传送
networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输 ...
- PHP代码审计基础
php核心配置 php.ini 基本配置 语法 大小写敏感 运算符 空值的表达式 安全模式 安全模式 safe_mode = off 用来限制文档的存取,限制环境变量的存取,控制外部程序的执行.PHP ...
- Rust <10>:宏导出、导入
源 crate 中使用 #[macro_export] 属性标记的宏,调用者可在导入此 crate 时添加 #[macro_use] 属性使用. 没有 #[macro_export] 的宏,外部不可见 ...
- 9.Jmeter自定义Sample(自定义测试内容)完成测试
问题:在某些场景下我们会发现Jmeter里面提供的各种Sample不能满足自己的需求,应为这个世界上的压力测试的逻辑本来就是千变万化的,所以这个时候我们如果自己实现一套测试逻辑(当Jmeter的基本e ...
- 牛客练习赛53 B 美味果冻
链接:https://ac.nowcoder.com/acm/contest/1114/B来源:牛客 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语言10485 ...
- ASE19 团队项目 alpha 阶段 Frontend 组 scrum7 记录
本次会议于11月11日,11:30 在微软北京西二号楼13158,持续15分钟. 与会人员:Jingyi Xie, , Ziwei Wu, Jiaqi Xu, Jingwei Yi, Hanyue T ...
- shell 的正则表达式 grep
以上例子的目的在于,正则表达式只能用grep -n 命令中才有作用.在ls中,他的意义是不同的,例如*符号. grep命令的解析 其中,几个特殊的正则表达式: [[:alpha:]] 代表 字母[[: ...