`
snowfox2008
  • 浏览: 124655 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于webwork和过滤器实现无代码侵入的原子级界面权限

阅读更多

在我们开发产品或项目的过程中,经常会遇到的用户关于对界面权限控制的需求,如一个审批表单,由基本字段和审批意见等字段组成,用户要求不同角色进入页面时,对页面中不同的输入框有不同的权限,例如申请人只能填写基本信息的输入框,对于审批意见的输入框是只读的,而审批人进入相同的页面时,可以在审批意见的输入框中填写意见。这是一个最简单的业务需求。

通常我们实现这样的需求时,需要在我们的页面中嵌入N多的if...else来实现对输入框的状态进行控制,导致了权限逻辑和页面展现混在一起,显得极其臃肿。我在使用webwork的过程中,通过对webwork源代码的深入了解,想到了修改webwork的基类UIBean来实现页面的权限控制:

1、首先将页面的权限定义保存到数据库或xml的配置文件中;

2、编写一个监听器LoadPagePermissionListener来从权限的描述文件中,加载权限信息到缓存;

3、编写页面权限过滤器,例如PagePermissionFilter,实现对页面请求的过滤;

4、当用户请求一个web表单时,首先通过.action去请求,此时.action被PagePermissionFilter过滤器拦截到,此过滤器中从用户所请求的web表单对应的XML权限描述文件或数据库中取得此web表单中所有HTML控件的权限集合,并将此集合传递给webwork的控制器,最后到webwork的HTML控件生成器的父类UIBean,由UIBean去render我们请求的表单中的所有HTML控件,这render之前,我们通过改写这个UIBean,使其在render每个控件之前,先从我们的权限集合中取出这个控件的权限(可编辑、只读、可视、不可视)进行设定,然后根据设定的权限进行渲染,最后我们看到的就是一个经过权限过滤的界面了,并且这个表单对于用户完全是透明的,开发人员不用添加任何关于表单控件权限的代码!

5、等等,到此并没有结束,由于webwork对于Select框、radio框、checkbox框等的只读显示状态并不能满足用户的需求,例如对于select框,用户要求只读状态时,不显示边框,只显示实际的字段值,呵呵,此时怎么办?没关系,见如下代码:

if ("readonly".equals(this.permission)){
            if (template.equals("text") || template.equals("radio") || template.equals("checkbox") || template.equals("textarea")){
                template = "labelhidden";
            }
            if (template.equals("select")){
                template = "hidden4select";
            }
        }

也就是说,在只读权限时,我们直接替掉webwork默认的freemarker模板,自己写一个freemarker模板,例如我自己写了一个hidder4select的模板,实现select框在只读状态时,只显示字段值。到此为止我们完全实现了无任何代码侵入的页面原子级的权限控制

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics