混合方式数据验证方案的研究

2013-11-30 05:02陈建勋
计算机工程与设计 2013年1期
关键词:表单服务器端监听

刘 成,张 凯,陈建勋

(武汉科技大学 计算机科学与技术学院,湖北 武汉430065)

0 引 言

在企业级信息系统中,数据的准确性、合法性是企业关注的核心。数据验证是指对数据在特定的上下文中的合法性检查,是过滤非法数据的安全屏障[1]。在企业级应用项目中,几乎所有与用户交互相关的地方也都会用到数据验证,它既可以防止非法数据进入系统内部,又可以及时为用户反馈录入数据的验证结果。所以,数据验证是提高软件系统鲁棒性的一个关键过程。

一般来说,数据验证根据不同的因素有不同的类型划分。从场所上来说分为:客户端验证、服务器端验证和数据库端验证。从验证时机来说分为:用户输入时验证和用户输入后验证。其中验证输入时只能在客户端实现。从验证复杂度来说分为:录入控制、域完整性校验、实体完整性校验和参照完整性校验。录入控制是约束用户输入的每个字符;域完整性校验指输入项要有指定的规则;实体完整性校验指在域完整性的前提下,不同域之间是否存在相互矛盾;参照完整性校验指在满足以上验证基础上还要考虑到数据在数据库表中主键不能重复的问题等。

当前大多数数据验证方案:只实现验证复杂度中域完整性校验,从而数据验证功能不够全面;验证场所单一化,导致服务器端效率较低。如文献[2]提出了一种面向切面的数据验证组件设计方案,该方案只在服务器端进行数据验证,验证场所单一,不能实现验证复杂度中的录入控制,会降低用户与系统的交互效率。文献[3]提出了基于Valang技术的数据验证方案,该方案能实现完整的数据验证功能,但验证功能在客户端和服务器两端有重复性工作,服务器端性能没有最优化,并且移植性较不好。为了克服以上问题,本文提出一种客户端和服务器端在验证复杂度上进行分工合作的混合验证方案。

1 混合验证方案的设计

基于系统的移植性和维护性,开发者一般不采用数据库端验证的方式。要实现一个完善的数据验证功能,应该包括4种验证复杂度。从验证场所来说,不管是客户端数据验证还是服务器端数据验证都不能覆盖所有验证复杂度,但两者的并集可以实现所有的验证复杂度验证。

本文验证方案的整体组织结构图如图1所示。将验证复杂度中的录入控制验证和域完整性验证在客户端实现,实体完整性验证和参照完整性在服务器端实现。其依据是:把尽可能多的任务放到客户端处理是提高服务器端效率的有效途径。在上述的验证复杂度中,前两者只涉及到词法分析,可以在客户端完成;后两者需要语义分析,需要在服务器端进行。但同时为了数据验证的安全性,在客户端验证失效时,服务器端也能处理域完整性验证。

图1 验证方案的组织结构

1.1 客户端数据验证方案设计

以往客户端表单的数据验证中,一般在文本对象模型(document object model,DOM)元素中指定了点击事件的触发函数,如给提交按钮指定onClick触发事件,并在此函数中进行数据验证。该验证函数逐个检验表单中每个组件的值,若全部验证成功则执行后台操作,否则提示用户错误的表单项,阻止后续的操作。这种实现在逻辑上易于理解,但是表示层的组件代码需要引用验证函数,而验证函数也要引用表单项组件,两者不能独立开来,导致耦合度较高,不易于维护和扩展,重用性也较低。

针对此问题,提出了在客户端以事件监听方式分离表示层和表示层数据验证的方案。客户端验证的模型包括XML文件、表单、验证文件、事件监听器。其具体框架如图2所示。

图2 客户端验证框架

在图2中,验证模型的各个部分之间的功能如下:

(1)XML配置文件。它描述对应表单中具体表单项所采用的验证方式。它以验证类(Validator类及其子类)的数组形式被加载到程序中。在客户端框架中,由于表单多样化,XML文件需要编程人员具体编写。XML文档包括一个根结点和多个第二级结点,其格式约定如下:

<FormValidator>

<Validator type=”String”expression=””source=””/>

<Validator type=”Number”source=””/>

</FormValidator>

在第二级结点中,type属性代表域完整性验证的类型,expression表示按照正则表达式规则验证匹配,source对应表单组件的id。

(2)Validator类及其子类。该类的source属性指向表单中要验证的表单项元素,拥有对目标元素数据值验证的功能。Validator1和Validator2是Validator的不同子类,比如用来验证数字的验证类和用来验证日期的验证类等。

(3)表单。只描述表示层具体元素和排版信息,无需关心元素的value值是否需要验证。

(4)事件监听器。事件监听器FormValidator通过加载XML文件中的配置,把对应表单的验证需求信息以Validator类的形式全部存入其中。然后通过Validator给表单项添加上监听事件,并监听Validator类的验证结果。

1.2 服务器端数据验证方案设计

服务器端数据验证完成验证复杂度中的实体完整性验证和参照完整性验证。当用户取消客户端脚本运行状态时,客户端验证将失效,然而域完整性控制验证是系统安全性保障的必要条件,故服务器端需要域完整性验证。面向切面编程(aspect-oriented programming,AOP)技术能较好的分离服务器端验证模块和系统业务逻辑模块,使代码耦合度更低,Valang可以解决域完整性控制验证,并且侵入性小[3]。因此,本文采用AOP和Valang技术来实现服务器端的数据验证。

当客户端数据传到服务器端,服务器端执行相应的业务逻辑处理。在执行业务逻辑前AOP切面类截获处理函数的参数并阻止业务处理函数的执行,然后对截获的数据进行验证,从而实现业务逻辑和验证模块的完全分离。服务器端数据验证的数据流图如图3所示。

图3 服务器端数据验证数据流

服务器端数据验证主要进行了实体完整性验证和参照完整性验证,这些数据验证涉及到系统中的逻辑性问题。譬如,工程的开工日期不能大于结束日期、身份证的隐含性别和填写性别不能矛盾、凭据有效日期在几个月之内、数据库表能接受当前信息的插入等。而在服务器端的域完整性验证是在客户端验证失效的情况下才执行,其通常是约定参数的格式。譬如,时间的格式、身份证号码的格式等。服务器端数据验证模块结构图如图4所示。

图4 服务器端数据验证模块类结构

Java能较好的阐述逻辑性问题,适合实体完整性验证和参照完整性验证;Valang支持以XML配置方式来约束验证项的约束规则,适合域完整性验证。在图5中通过Java编码方式实现实体完整性验证和参照完整性验证,从Spring IoC(inversion of control,控制反转)容器中取得验证规则并用Valang方式实现域完整性验证。

2 混合验证方案的实现

2.1 客户端事件监听方案工作流程

DOM是一种与浏览器、平台、语言无关,允许程序和脚本动态的访问和更新HTML与XML文件内容、结构和样式的API[4]。DOM定义了标准的事件机制,目前大部分主流的浏览器实现了该事件机制[5]。在DOM标准下除了可以直接为DOM元素指定事件,也可以通过注册的方式为DOM元素绑定事件[6]。本文客户端验证方案的核心是通过独立于表示层外的XML文档来为表示层组件注册on-Change事件。

客户端验证方案的工作流程在时间上分为两个阶段。第一个是程序加载时的初始化阶段:①初始化一个Form-Validator对象用来控制表单验证;②把XML静态配置文件中的每个结点转化成Validator对象添加到FormValidator中,为每个Validator对象的源目标source注册onChange监听事件。设置每个Validator对象的触发者trigger为FormValidator;③在FormValidator中初始化一个bool类型数组voteMap,其中的元素对应每个Validator是否验证成功的布尔值,全部初始化为false;④设置每个Validator对象验证成功和验证失败的监听函数,在这个监听函数中回调自定义的函数。

第二个阶段是用户开始向表单中录入数据:①用户在表单中录入数据,触发表单元素的onChange事件;②on-Change事件被FormValidator监听,FormValidator中定义了对应的监听函数,并分派出CHANGE事件;③在初始化阶段设定了Validator的触发者为FormValidator,当FormValidator派出CHANGE事件时会使Validator进行表单项数据验证,并对验证的结果发出valid(验证合法事件)或invalid(验证不合法事件);④在FormValidator中设定了对Validator发出的valid和invalid事件的监听,然后做出相应的回调事件。图5是用户在录入时,客户端进行的一次数据验证时序图。

图5 用户输入时验证的一次验证时序图

2.2 服务器端数据验证实现

AOP为开发者提供了另一种组织应用程序结构的方式,不再是面向对象编程(Object Oriented Programming,OOP)中的类和接口,它主要的编程元素是切面(aspect),故它善于解决项目中的横切性问题[7-8]。

目前,成熟的AOP框架比较多,它们都是针对不同的目的,基于不同的技术实现。但主流的有AspectJ、JBoss AOP、Spring AOP三个开源的框架[9]。本文采用Spring AOP框架实现服务器端数据验证。Spring AOP的基本术语见表1。

表1 Spring AOP基本术语

在Spring AOP应用中,开发者只需进行AOP的相关配置。本文涉及以下配置项,切面类(Aspect):业务逻辑中横切性的问题,如数据验证;切入点(PointCut):切面动作切入到业务逻辑中的具体位置,通常是一串匹配符;连接点(JoinPoint):切入点地方的业务逻辑,在Spring中是业务逻辑中的某些函数;通知(Advice):决定切面在连接点之前还是之后等。Spring AOP含有5种advice,Before、After、AfterReturning、AfterThrowing、Around,其中Around是所有通知类型中功能最为强大的,能够全面控制连接点,决定何时执行连接点甚至短路连接点,起到一个真正拦截器的作用[10]。数据验证如果不通过,那么业务逻辑就不会执行,用Around通知可在此时短路业务逻辑。

Valang是一种支持声明式的验证器。作为一种新型的验证工具,它提供了专门的验证语言,具有简单、易扩展和可读性高等特性。Valang除了可以应用到Spring MVC(module-view-control,模型-视图-控制)框架中,还可以对简单Java对象(plain old java objects,POJO)进行验证[11]。Valang支持XML配置方式,可以通过Spring的IoC把验证类注入到环境中从而降低了耦合度[12]。为了提高验证的绝对安全性,本文采用Valang作为 “替补”,仅在客户端失效的时候代替客户端完成域完整性验证:用Valang验证语言定制表达式,并通过Spring依赖注入(depending injection,DI)方式注入到Bean标记定义的验证器的Valang属性中。验证器由Valang框架提供,开发者只需配置与POJO对应的属性约束。其约束性验证语言通俗易懂且与系统低耦合。

3 验证方案的实际运行

3.1 客户端验证方案的使用方式

在客户端验证方案中实现了验证核心类FormValidator和对数据进行域完整性验证的Validator类。在使用的过程中分为如下3步:①编写对应一个表单的XML文件;②在客户端页面加载程序中初始化FormValidator对象,并加载XML文档;③设定FormValidator对象的验证失败和验证成功时的回调函数,通常是设定 “提交按钮”是否可用。其中②③步骤在不同的应用中使用方式都一样,所以客户端验证方案的主要任务是编写对应表单的XML文件。XML文件的约束格式简单,能适应表单的需求变化,灵活性强。

3.2 服务器端验证方案的使用方式

在服务器端的验证方案中,实现技术是Spring AOP和Valang技术。AOP技术跟验证模块没有直接的关系,它是把验证模块彻底从业务逻辑中分离出来,降低系统模块的耦合度。而验证模块的代码实现需要编程人员根据系统的特定逻辑具体实现。AOP配置核心代码如下:

在上述配置代码中,把AOP切面指定到类validate-Aop上,并采用validateAop类中的ValidateDatas方法来进行数据验证,而AOP的横切性关注点是checkData,即形如 “* bllimpl.*.add*(..)”和 “bllimpl.*.mod*(..)”形式的方法(bllimpl包下所有类中以add和mod开头的方法)。在ValidateDatas方法中进行编程人员自定义的验证逻辑。Valang方面以验证POJO为例,如类User(其只包括username,age一个String类型和一个int类型)为例,验证器bean的定义和验证规则注入。

3.3 验证方案的运行效果

最后在某个矿山企业的工程项目管理系统中采用此验证方案实现该系统的数据验证功能。以其中的付款凭证录入界面为例,其实际运行效果图如图6、图7所示。在图6和图7需要验证的表单项中,凭证号按凭证的编写规则进行验证,预付款、结算款、扣材料、质保金等都是金额。图6为有非法输入的界面,图7为正确输入的界面。

图6 验证不成功时界面

该验证方案有较好的交互性。当表单项的验证不成功时,表单项的边框变成红色,能清晰的告诉用户所输入的数据是否合法。并且当光标落到输入不合法的表单项时能提示用户具体的错误信息。界面的 “提交”按钮最初以不可用的状态呈现给用户,直到用户填写的所有数据符合了验证规则,“提交”按钮自动转成可用状态。当客户端满足验证进行提交后,如果服务器端实体完整性验证和参照完整性验证不通过,以弹出框的形式提示客户端用户。经该系统的投入运行,确实提高了用户交互的效率。

图7 验证成功时界面

4 结束语

本文的数据验证方案完整地实现了所有的验证复杂度,与传统只关注域完整性验证方案相比有较好的安全性和用户体验;采用分工合作的多场所验证方式,与传统单一场所验证方式相比有较高的效率。实现方式上分别在客户端采用事件监听机制和服务器端采用Aop和Valang技术,与传统AOP数据验证方案相比更简化数据验证模块。该方案可以应用到所有以服务器/客户端模式的管理系统中。但不足之处在于AOP和Valang技术依赖Java的Spring框架,服务器端实现方式只能在Java环境中实现。

[1]YANG Tiejun,NIU Qinzhou,HUANG Lin,et al.Method of heterogeneous data validation based on interface definition[J].Computer Engineering,2009,35(24):66-68(in Chinese).[杨铁军,牛秦洲,黄琳,等.基于接口定义的异构数据有效性验证方法[J].计算机工程,2009,35(24):66-68.]

[2]ZHAO Guangli.Research and implementation of aspect-oriented data validation component[J].Computer Engineering and Design,2010,31(1):206-209(in Chinese).[赵广利.面向切面的数据验证组件研究与实现[J].计算机工程与设计,2010,31(1):206-209.]

[3]CHENG Man,ZHAO Binzhi,WANG Tianli,et al.Research on data validation with Valang[J].Computer Engineering and Design,2009,30(13):3251-3253(in Chinese).[程满,赵宾植,王天理,等.基于Valang技术的数据验证机制研究[J].计算机工程与设计,2009,30(13):3251-3253.]

[4]ZHANG Ruixue,SONG Mingqiu,GONG Yanlei,et al.Parsing DOM tree reversely and extracting web main page information[J].Computer Science,2011,38(4):213-215(in Chinese).[张瑞雪,宋明秋,公衍磊,等.逆序解析DOM树及网页正文信息提取[J].计算机科学,2011,38(4):213-215.]

[5]Patrick O Bobbie,Yiming Ji.Modeling and synthesizing eventdriven simulators from collaborating uml statecharts[C].10th IASTED International Conference on Software Engineering and Applications,2006:1-7.

[6]GUO Hongyan,YANG Bo,JIN Beihong,et al.Research on high performance DOM implementation[J].Computer Science,2006,33(6):274-277(in Chinese).[郭红艳,杨波,金蓓弘,等.高效DOM实现的技术研究[J].计算机科学,2006,33(6):274-277.]

[7]ZHANG Xian,DONG Wei,QI Zhichang,et al.Conflicts detection in runtime verification based on AOP[J].Journal of Software,2011,22(6):1224-1235(in Chinese).[张献,董威,齐治昌,等.基于AOP的运行时验证中的冲突检测[J].软件学报,2011,22(6):1224-1235.]

[8]SHAO Fudong,LIU Xiaodong,YANG Baoming,et al.Research and implementation of program condition visualization based on AOP[J].Journal of Computer Applications,2006,26(10):2483-2485(in Chinese).[邵付东,刘晓东,杨保明,等.基于AOP的程序状态可视化方法研究与实现[J].计算机应用,2006,26(10):2483-2485.]

[9]ZHANG Yingjie,LIU Wanjun.Research on the application of Spring AOP in the security authentication of J2EE systems[J].Computer Engineering & Science,2008,30(8):137-138(in Chinese).[张英捷,刘万军.Spring AOP技术在J2EE系统安全性验证中的应用研究[J].计算机工程与科学,2008,30(8):137-138.]

[10]Eric Tanter,Rodolfo Toledo,Guillaume Pothier,et al.Flexible metaprogramming and AOP in Java[J].Science of Computer Programming,2008,72(1/2):22-30.

[11]Pasquale Arpaia,Mario Luca Bernardi.An aspect-oriented programming-based approach to software development for fault detection in measurement systems[J].Computer Standards and Interfaces,2010,32(3):141-152.

[12]ZHAO Yanni,WANG Yinghui,LEI Yu,et al.Research and implement of software framework based on IOC/AOP[J].Computer Engineering and Applications,2008,44(29):92-95(in Chinese).[赵艳妮,王映辉,雷宇,等.一种基于AOP/IOC的软件框架研究与实现[J].计算机工程与应用,2008,44(29):92-95.]

猜你喜欢
表单服务器端监听
电子表单系统应用分析
英国风真无线监听耳机新贵 Cambridge Audio(剑桥)Melomania Touch
Linux环境下基于Socket的数据传输软件设计
千元监听风格Hi-Fi箱新选择 Summer audio A-401
基于图表示和匹配的表单定位与提取
浅谈网页制作中表单的教学
网络监听的防范措施
基于Qt的安全即时通讯软件服务器端设计
基于Qt的网络聊天软件服务器端设计
应召反潜时无人机监听航路的规划