文档章节

openfire插件开发的几点说明

丁佳辉
 丁佳辉
发布于 2017/02/17 11:43
字数 1427
阅读 30
收藏 0

1.关于插件的目录结构

这个网上的资料很多,但是我觉得要看懂也不太容易,我这里上一个包括了jsp和servlet的图,希望大家能马上看懂:

ME的Navigator视图下的截图:

build path配置

这里要注意,如果你的plugin里边有自己的jsp文件,那最好把整个openfire_src/work/lib下的包引进来,以免ant编译时找不到jasper类而报错。当然,这里边也包含了openfire.jar,插件调用openfire api时就用到了。

至此,你的项目基本该怎么弄,就怎么弄吧。

 

发个官网上的目录结构:

2.插件项目的命名

项目的名称无所谓大小写,插件名称也与plugin.xml里边的name属性没丝毫关系,plugin.xml里边的name属性只在openfire插件管理界面里边做显示用。

但是你的i18n文件命名就要注意了,一定要是%[plugin_name]%_i18n "_" language ".properties"格式。

代码里获取插件时的名称是大小写无关的。

[java]  view plain  copy
  1. plugin = (MainPlugin) XMPPServer.getInstance().getPluginManager()  
  2.                 .getPlugin("popplugin");  

3.去掉openfire的登录验证

对于一些安全性不高的插件来说,可能根本并不需要openfire的登录,那怎么单独对自己插件的url进行排除呢?接着往下看!

有两种方法:修改openfire的web.xml或使用AuthCheckFilter.addExclude方法其中一种即可

1)修改openfire的web.xml

这个web.xml出现在openfire的源码很多地方,了解正确的配置方法很重要。下面展示不同路径下的web.xml修改说明,取其一即可。

a. 修改/openfire_src/src/web/WEB-INF/web.xml,修改完后,记得还要用ant编译一次并重启才能生效。

b. 修改/openfire_src/target/openfire/plugins/admin/webapp/WEB-INF/web.xml

修改完后,直接重启即可生效,本方法同样适用于安装版的openfire

[html]  view plain  copy
  1. <filter>  
  2.     <filter-name>AuthCheck</filter-name>  
  3.     <filter-class>org.jivesoftware.admin.AuthCheckFilter</filter-class>  
  4.     <init-param>  
  5.         <param-name>excludes</param-name>  
  6.         <param-value>  
  7.             popplugin/*,login.jsp,index.jsp?logout=true,setup/index.jsp,setup/setup-*,.gif,.png,error-serverdown.jsp,setup/clearspace-integration-prelogin.jsp  
  8.         </param-value>  
  9.     </init-param>  
  10. </filter>  

 

 url的匹配规则比较复杂,有兴趣的同学可以去看AuthCheckFilter类源码,如果要测试自己的pattern对不对,可以使用org.jivesoftware.admin.AuthCheckFilterTest类执行JUnitTest试试,如自己加上一段:

[java]  view plain  copy
  1. assertTrue(AuthCheckFilter.testURLPassesExclude("popplugin/sendmessage", "popplugin*"));  
  2. assertTrue(AuthCheckFilter.testURLPassesExclude("popplugin/sendmessage", "popplugin/sendmessage"));  

 

2)使用AuthCheckFilter.addExclude方法

调用该方法和配置web.xml的效果是完全一样的,个人建议用此方法,因为本方法绿色安全、无污染,不修改和破坏原生openfire代码。

这个方法可以在servlet的init方法或plugin的initializePlugin方法中调用。

个人建议在servlet的init方法中调用,因为servlet的init方法比plugin的initializePlugin方法更早初始化,这个问题在“插件初始化顺序”会讲到。

使用完后记得removeExclude一下,有始有终嘛。

[java]  view plain  copy
  1. @Override  
  2. public void init() throws ServletException  
  3. {  
  4.     System.out.println("UserMgrServlet init....");  
  5.     AuthCheckFilter.addExclude("popplugin/usermgr*");  
  6.     AuthCheckFilter.addExclude("popplugin/usermgr/*");  
  7. }  
  8.   
  9. @Override  
  10. public void destroy()  
  11. {  
  12.     System.out.println("UserMgrServlet destroy....");  
  13.     // Release the excluded URL  
  14.     AuthCheckFilter.removeExclude("popplugin/usermgr*");  
  15.     AuthCheckFilter.removeExclude("popplugin/usermgr/*");  
  16. }  


 注意:这种方式仅限于servlet的访问,如果访问插件的jsp/html页面,页面会报NullPointException异常,解决办法见下面的第8点说明

4.如何编译自己的openfire插件

比较流行的一篇文章《一步一步开发自己的openfire插件》里,用的是自己写的ant脚本,本人不推荐,除非你对ant脚本非常熟悉。

我建议的做法是:

先把openfire源代码下载下来并成功用build.xml编译部署;

将自己的plugin项目copy到/openfire_src/src/plugins下;

执行openfire自带的build.xml,执行命令如下:

ant -f build.xml -Dplugin=插件名字 plugin

用自带的build.xml和源码编译的好处是:编译完后,插件会自动发布更新。

发布完成后,你的plugin就会出现在/openfire_src/target/openfire/plugins/下.

发布后完整的plugin目录如下:

5.插件初始化顺序

1.创建你的plugin对象实例

2.创建你的servlet对象实例

3.调用你的servlet.init()方法

4.调用你的plugin.initializePlugin()方法

这里要注意3和4两个步骤,不要像我当初一样,一位先是4,再是3,然后把一些初始化操作放到4中去,结果在servlet调用的时候出现了空指针异常。

6.插件的日志

最后,再配上日志,你的插件环境基本就搭建好了。剩下的就是添加功能了,这个相信对各位来说就不成问题了。

1.将log4j.jar添加进你的plugin的lib目录下,并添加进classpath。

2.需要日志的Java类中添加日志代码

3.找到openfire的log4j.xml配置文件,目录为:openfire_src\target\openfire\lib\log4j.xml,源代码的路径就是:/openfire_src/build/lib/dist/log4j.xml

4.为自己的package和class配置独立的日志。如果不修改log4j.xml,则openfire会将你的日志输出到openfire_src\target\openfire\logs相应的级别日志下。

7.插件访问自己的i18n属性

[java]  view plain  copy
  1. LocaleUtils.getLocalizedString("popplugin.destroyPlugin", "popplugin")  


第一个参数是i18n配置文件中的key,第二个是插件名称,与加载插件时的名称一致。

8.插件的页面不使用openfire控制台的页面框架

安装版的openfire的话,修改/openfire/plugins/admin/webapp/WEB-INF/decorators.xml文件

源代码版的,要修改/openfire_src/src/web/WEB-INF/decorators.xml文件

示例:

[html]  view plain  copy
  1. <excludes>  
  2.     <pattern>/plugins/popplugin/*</pattern>  
  3.     <pattern>/setup/setup-completed.jsp*</pattern>  
  4.     <pattern>/setup/setup-ldap-server_test.jsp*</pattern>  
  5.     <pattern>/setup/setup-ldap-user_test.jsp*</pattern>  
  6.     <pattern>/setup/setup-ldap-group_test.jsp*</pattern>  
  7.     <pattern>/setup/setup-clearspace-integration_test.jsp*</pattern>  
  8.     <pattern>/setup/setup-admin-settings_test.jsp*</pattern>  
  9.     <pattern>/login.jsp*</pattern>  
  10.     <pattern>/plugin-icon.jsp*</pattern>  
  11.     <pattern>/js/jscalendar/i18n.jsp*</pattern>  
  12. </excludes>  

这样,插件popplugin目录下的所有路径的jsp页面及js,css等,都能被自由的访问了。

至此,海阔天空任鸟飞了。。

© 著作权归作者所有

共有 人打赏支持
丁佳辉
粉丝 18
博文 402
码字总数 196997
作品 0
浦东
程序员
Openfire学习之三: Openfire3.9.3中基于web的插件开发

在前面的博客中,我介绍了openfire插件开发,在那篇博客中我详细的说明怎样开发一个基于控制台的插件,这篇博客中我要介绍基于web的插件程序,同样,这篇博客实在openfire插件开发的基础上开...

明舞
2014/12/17
0
0
XMPP学习笔记-LESSON-007:XMPPServer.java之Plugin开发

网上关于openfire开发的文字非常多,在这里推荐一篇文章: http://redhacker.iteye.com/blog/1919329 openfire插件开发之完美开发 这是单独开发openfire插件的的一个实例。 不过我个人还是建议...

今幕明
2014/02/21
0
0
基于开源 Openfire 聊天服务器 - 开发Openfire 聊天记录插件

上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfire插件。一步步很详细的介绍到简单插件开发,带Servlet的插件的开发、带JSP页面插...

ibm_hoojo
2013/03/29
0
0
openfire插件开发整合SpringMVC openfire mybatis开发问题

@明舞 你好,想跟你请教个问题: 最近由于公司要开发openfire的插件,整合springmvc openfire mybatis的插件,之前并没有接触过openfire,然后我找到了您以前的帖子: openfire如何整合sprin...

mzloverrun9527
2016/02/02
948
2
跟我一步一步开发自己的Openfire插件

这篇是简单插件开发,下篇聊天记录插件。 开发环境: System:Windows WebBrowser:IE6+、Firefox3+ JavaEE Server:tomcat5.0.2.8、tomcat6 IDE:eclipse、MyEclipse 8 开发依赖库: Jdk1.6...

ibm_hoojo
2013/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nginx模块学习六 add_header 跨域访问

语法 Syntax: add_header name value [always];Default: --Context:http,server,location,if in location 例:/etc/nginx/conf.d/default.conf server {    listen       80; ......

Romanceling
今天
0
0
SpringBoot初探

#SpringBoot初探 三种创建SpringBoot项目的方式: 第一种:使用IDEA创建maven项目,选择maven-archetype-quickstart; 第二种:使用IDEA创建Spring Initializer,选择web组件; 第三种:使用...

向码而生
今天
2
0
IO

JAVA中IO技术:BIO、NIO、AIO 1、同步异步、阻塞非阻塞概念 同步和异步是针对应用程序和内核的交互而言的。 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方...

DemonsI
今天
0
0
org.apache.commons 常用工具类

一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流、socket、或者selector且不抛出异常。通常放在finally块。 toString 转换IO流、 Uri、 byte[]为String。 copy IO流数据复制,...

sprouting
今天
0
0
linux使用Inotify监控目录或者文件状态变更

基本概念: Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 需求: 1.有一个文件采集进程,...

mickelfeng
今天
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部