openfirespark二次开发服务插件Word下载.docx
《openfirespark二次开发服务插件Word下载.docx》由会员分享,可在线阅读,更多相关《openfirespark二次开发服务插件Word下载.docx(7页珍藏版)》请在冰豆网上搜索。
组织则用自带的。
(当然这是预想。
其实openfire已经帮我们想过了。
)
接着、全局搜索了openfire源码中包含ofuser表sql的类。
只有两个类。
很庆幸。
改了之后,改造用户密码加密认证方式。
当然这样做是错误的。
直到我发现类名字似乎有些不对的时候。
DefaultUserProvider哈哈、嘲讽啊。
不出所料有一个实现类JDBCUuserProvider。
直接配置就可以搞定、但是加密sha256加密过程和我平台不一样。
改造后就顺利搞定。
接着、到了插件开发过程。
这个过程很烦人。
网上很多帖子很多人去讲这个开发过程。
或许是两三年前的贴了。
很多过时了。
只能有一点帮助。
更多的是走向了错误的道路。
磕磕碰碰。
最终还是只能从源码中寻求出路。
这个过程整整浪费了我两星期时间。
很痛苦。
所以。
我会针对最新代码聊聊,spark开发一个组织架构树插件。
展示出用户。
并可以与之聊天。
打包openfire,spark插件过程。
打包项目为exe文件。
等
=======================废话end=========================
openfire10,出来啦。
^_^支持自定义组,性能优化很多。
本文内容有:
1、openfire自定义用户表需要注意的地方
2、openfire服务器插件开发(开发环境搭建不说了。
下载项目,目前3.10,3.93都没有任何错)
3、openfire插件打包。
3、spark插件开发
4、openfire/spark打包exe
一、Openfire自定义用户表
userManager会在初始化的时候从数据库读取UserProvider/AuthProvider的实现类。
默认是defaultUserProvider
这些实现类参数被保存在ofproperty表中。
我们直接通过更新表完成对自定义用户表的配置。
insertintoofProperty(name,propValue)values
('
jdbcProvider.driver'
'
com.mysql.jdbc.Driver'
),
jdbcProvider.connectionString'
jdbc:
mysql:
//主机地址/数据库?
user=root&
amp;
password=root'
--用户表数据库连接信息
admin.authorizedJIDs'
admin@127.0.0.1'
),
--管理员账号信息,@amy-tang是安装openfire服务器时填写的IP,也可以写成服务器的域名。
jdbcAuthProvider.passwordSQL'
SELECTpasswordFROMsys_userWHEREaccount=?
'
--校验用户名密码sql语句
jdbcAuthProvider.passwordType'
sha256'
),--用户表加密方式
jdbcUserProvider.loadUserSQL'
SELECTfullname,emailFROMsys_userWHEREaccount=?
--查询用户的sql语句
jdbcUserProvider.userCountSQL'
SELECTCOUNT(*)FROMsys_user'
jdbcUserProvider.allUsersSQL'
SELECTaccountFROMsys_user'
jdbcUserProvider.usernameField'
account'
jdbcUserProvider.nameField'
fullname'
jdbcUserProvider.emailField'
Email'
--用户表关键字段的字段名称。
模糊查询用户拼装sql使用.account是账号唯一标示,fullname是用户名。
sys_user是用户表
UPDATEofPropertySETpropValue='
org.jivesoftware.openfire.user.JDBCUserProvider'
WHEREname='
provider.user.className'
;
--设置用户数据库持久层实现类
org.jivesoftware.openfire.auth.JDBCAuthProvider'
provider.auth.className'
--设置密码校验持久层实现类
注意事项:
1、加密key:
plain/md5/sha1/sha256/sha512加密过程详见org.jivesoftware.util.StringUtils.hash(password,"
MD5"
);
2、admin.authorizedJIDs=admin@主机地址当Openfire修改了主机地址/域名的配置后admin无法登陆服务器。
需要修改数据库中配置的主机地址,
二、Openfire服务器插件开发
1、openfire中插件目录介绍,以及开发前准备。
Openfire源码环境搭建很简单。
目前3.10版,3.9版都没有任何问题直接能用,不用多余下载任何jar。
将源码解压至工作空间,新建相同项目名称即可。
如图:
暂时没用的插件可以buildpathremovefrompath先从工作空间移除。
剩下需要的开发插件如上图右
10的sourceoutputfolder有点问题,指向了一个插件里面。
修改即可。
项目右键—》buildpath—》configurebuildpath..—》Source—》outputfolder:
openfire_src/bin
9问题也不多,网上很多文章都很有用可以检索openfire二次开发去查阅相关搭建开发环境的文章。
开发前,建议先吧xmldebugger插件打开,或者留在src中。
会把所有交互xml打印输出非常有利于调试。
开发插件前,我们可以先看下,自带的那些插件的目录结构。
可以看出来开发插件都是依赖项目开发的,这样直接可以引用项目中的资源,bean。
不建议单独起一个project去开发插件
2、插件开发介绍
例如组织架构插件,我是将它作为一个服务组件进行开发,对外提供组织树的服务。
当客户端访问服务器jabber:
iq:
loadOrg的服务的时候,根据提供的参数返回组织架构,与用户信息、该插件需要实现两个接口Component,Plugin。
贴下代码
OrgTreePlugin代码,
请看打开代码自己查看。
该插件需要实现两个接口Component,Plugin,并实现相应方法。
插件的初始在PluginManager中419行。
可以断点查看插件初始化过程。
419StringclassName=pluginXML.selectSingleNode("
/plugin/class"
).getText().trim();
420plugin=(Plugin)pluginLoader.loadClass(className).newInstance();
服务注册也很简单如:
OrgTreePlugin代码initializePlugin方法。
componentManager.addComponent(serviceName,this);
只是需要注意的是,该服务注册为服务组件的时候,会测试的访问该服务,测试是否正常。
如果出现异常就会自动调用componentManager.removeComponent(serviceName);
,将改服务移除服务组件。
具体代码可以查看InternalComponentManager的addComponent()方法。
代码很简单。
DefaultOrgTreeProvider则为数据访问层。
不再贴了。
插件目录结构如下:
3、插件打包
最初在看openfire插件开发相关文章的时候、都提供了很多打包的方法,不过用着很不开心。
其实项目已经提供了所有各个功能的ant脚本build目录下build.xml文件。
三、spark插件开发
spark插件开发与openfire大略相似,
需要自身了解AWT相关的知识。
打包插件需要注意一点在build.xml中targetname="
build.plugins"
添加自己插件。
这样运行antbuild.plugins的时候就可以打包自己的jar了
build.plugins
&
lt;
subanttarget="
"
&
gt;
filesetdir="
./src/plugins/orgTree/"
includes="
*/build.xml"
/&
/subant&
获取请求服务,处理数据关键代码
//请求消息定义
publicclassOrgTreeLoadextendsIQ
privateJSONArraygetOrgTreeJSON(StringorgId)throwsXMPPException{
//获取host
Connectioncon=SparkManager.getConnection();
host=con.getHost();
OrgTreeLoadsearch=newOrgTreeLoad();
search.setType(org.jivesoftware.smack.packet.IQ.Type.SET);
search.setTo("
loadOrg."
+host);
//消息包处理
search.addExtension(OrgTreePacketExtension.getNewPacketExtension(orgId));
PacketCollectorcollector=con.createPacketCollector(newPacketIDFilter(search.getPacketID()));
con.sendPacket(search);
IQresponse=(IQ)collector.nextResult(SmackConfiguration.getPacketRepl