欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OSGi动态拔插,动态部署,动态权限菜单

程序员文章站 2022-03-03 08:32:23
...


今天和思雨同学把动态菜单,权限以及Bundle的动态拔插基本给解决了。


大致的场景是这样的:


1、进行权限控制,RBAC0,权限-角色-菜单,菜单只是对应到页面,不涉及页面的具体操作组件,实现起来不是太麻烦。(之前本来打算把权限控制到按钮的,但是项目只要求到页面就方便了很多)。

 

 

2、权限控制这块,之前打算控制到组件,用的自定义标签,TagSupport或SimpleTagSupport,其他的项目用了自定义标签,不过麻烦也随之而来了。传统Web项目,有WEB-INF目录,自定义标签放在这个目录下。OSGi以Bundle形式开发,同时也没有WEB-INF目录,如何让OSGi识别tld文件,同时让其他Bundle能够使用这个自定义标签成了问题(把jetty模块当成Bundle嵌入其中的这种方式,我像通过解压jettyBundle,将标签放入jettyBundle的WEB-INF目录,但估计这种方式可能性较大,提供大家参考,可以自己动手试一把,我还没试验过)。

 

 

3、权限这块的,就是简单的数据库设计,不算太麻烦。这也是大家可以想到的。之前的系统每个功能模块的菜单权限通过配置文件配置,然后解析存放入数据库。用户登录时读配置文件校验。我的建议是保存数据库。为了保存菜单扩展点,首先判断数据库中是否有新Bundle的信息,没有就解析保存,有就直接读数据库。

 

 

4、由此可见,上面的配置文件之类的东西纯粹是依赖OSGi扩展点的。

 

 

5、OSGi的可拔插,之前我打算通过Spring DM发布服务,监听Bundle启动。解析Bundle之后保存入库。后来实现BundleListener接口,实现  public void bundleChanged(BundleEvent event) 方法,将解析方法放入其中。 注意:BundleListener接口所在的Bundle启动级别必须先启动,这里涉及一个启动级别的问题。

 

 

6、动态拔插:在平台启动之后,通过 install file 将开发模块install其中(注意,install之后bunldle的状态是Installed而不是started)。卸载就更方便了。

 

 

7、动态部署:这个问题结合上面的问题也很方便,上传至服务器指定目录,通过shell脚本安装。当然也可以通过数据库表保存相关Bundle路径信息实现。


提供给各位朋友参考,大家有更好的思路也可以和我讨论。