页面参数校验的过滤器实现

参数校验方式现状

在做WEB项目时,request的参数的校验一直都是我们必须关注的功能点,其中服务端的校验是必不可少的,很多时候我们的业务功能都是包裹在JavaBean的方法中,参数校验也掺和在里面。

目前比较良好的实现是将校验方法统一归纳到工具类中,在我们实际的业务方法中运用工具类来校验参数是否合法,这样的方式是可取的,但是却是十分不灵活的,假设现在有一个参数是phonenumber,显然,这个参数的组成必须是数字组成的,而且应该也限制了号码长度,或许还要限制区号等等,那么我们要校验这个参数可能需要调用校验工具类的三个方法,如果哪天需求改变了,又增加了一些新的限制条件,那么我们又必须打开JBuilder大海捞针般的找到那个方法,然后增加一段校验代码,更悲观的情况是假如这个号码涉及到几个方法中,那么你就得每个业务方法增加一段类似得校验代码,然后再编译。很繁,很烦。

如果能把所有的参数校验都分离出去,在业务方法中只要获得一个这个参数合不合格的结果,那是十分美妙的事情,不合格我们就转发,合格继续工作。下面就讨论一下页面参数校验的过滤器实现的具体方式。

页面参数校验的过滤器实

大家都对过滤器filter不陌生,我们经常用这个东东作字符集转换,或者session绑定之类的事情,因为它会捕获所有的请求,非常类似于流程的切面,那么我们完全可以在这里捕获所有的请求参数,然后一一把它们校验一把。

怎么实现?最开始的想法是利用Java编写的工具类,根据一个Properties资源文件的字段和校验策略的映射关系来动态调用工具类中的方法,这样的实现是可行的,但是一定会涉及到反射,有不少人对反射有偏见,认为效率低下,其实还是可以接受的,最后还是没有选择这种方式,因为反射代码量不少,而且可读性不是特别好,灵活性也一般。最终的实现方式是Java内嵌动态语言Python

基本流程如下:

1)        过滤器捕获了request,将request中的参数转换成Map

2)        开始遍历Map,获得key值和value值,也就是页面传来的参数名称和参数值。

3)        keyMappingIs这个Properties中根据键值key获取需要执行的Python方法,也就是我所说的策略。举个例子:customer.phone = check_digital, check_length(7),意思就是customer.phone这个参数需要执行check_digital方法和check_length两个Python方法。

4)        根据策略执行Python方法,这里有个关键点,就是参数(name, param)是默认必须实现的,name是指参数的名称,param是指参数的值,当然我也预留了自定义参数,例如check_length(7),实际的Python方法就是check_length(name, param ,7)。如果有多个参数例如要执行check_length(name, param , 7, 10)那么在策略里我们就应该写成customer.phone = check_digital, check_length(7; 10),注意参数之间用分号隔开的。

5)        获取Python方法的返回值,返回值是错误的详细信息,比如“参数:customer.phone 长度不能大于7”, customer.phone = check_digital, check_length(7),这个Python方法的执行顺序是先check_digital,然后check_length(7),如果其中一个返回错误就会退出,并将错误保存到一个Map errors中,键值就是这个参数的名称,接着校验其他的参数。

6)        当所有参数校验完毕后,将errors这个Map保存到request中,一起传递给业务方法或者控制层,控制层再根据errors层有取舍的转发页面。

这样的实现,实际上我们只需要使用Python实现所有的校验函数,然后再在配置文件keymapping.properties中配置需要在某个参数上策略,非常灵活。不过唯一一点要求就是要对能够写简单的Python方法,大家可以看看这个动态语言,很强大的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值