Guns二次开发(十三):自定义拦截器去除请求参数的首尾空格

 关于博客中使用的Guns版本问题请先阅读   Guns二次开发目录    

       前面的几篇博客中有说过,前端传入的参数,后端是需要做非空和合法性校验(比如商品id需要去数据库查询)的,因为一些不负责任的前端在调用后端接口之前,是不会做必传参数的空值校验的,如果后端也不做数据校验,就会导致非法数据被直接写入数据库,进而引发一系类的问题。对于Guns 这种前后端没有区分的项目,因为前端后端的工作都由Java开发人员包圆了,虽然能极大的保证前端检验会正常进行,但是后端校验应当作为一种硬性指标或者说是一种编程习惯,这也是我们后端人员对自己的工作的一种负责任的态度。

       其实前面的增删改查几篇博客中,项目源码不仅有做前端校验,后端校验其实也有介绍。比如后端使用 @Valid 注解来检验字段比较多的接口的参数,通过查询数据库来判断某些参数的合法性。而对于比较少的参数,前端控制器是直接通过@RequestParam 注解来接收的,但这是有问题的,如果此时参数的值是长度为0的空串时,@RequestParam 注解是无法当前判断传入的参数为无效参数的,此时后端代码需要调用StringUtils.isNotBlank()方法来判断。还有一些字符串参数,例如“  abc  ”,前端如果没有做去除首尾空格的操作,后端接收到后还是需要通过字符串的trim()处理后才能使用的。因此,后端校验对于字符串参数的处理,不仅需要去除参数的首尾空格,还要做非空判断。

        如果只是个别参数如此,也许还可以接受,毕竟工作量不大;但现实情况是几乎所有的参数都得做这样的校验啊!!!如果没有公共的方法来执行这个操作,那我岂不是需要在所有接口的内部业务逻辑执行之前,都写一大堆相同功能的代码来做这些操作?如果你这样做了,说明你对Java的理解真的还有待提高。我的解决方案是:通过Filter过滤器来过滤所有的请求参数,首先是对所有的参数key对应的value值做首尾空格的去除处理,然后再判断参数对应的value值是否为空串,如果是,则连同这个key我都不会传递下去。打个比方,假设请求参数是:{"key1":"    zhangsan  " , "key2" : "     "},那么过滤之后的参数就是:

{"key1" : "zhangsan"},此时就变成只有一个有效参数了,最终接口接收到的也只有这一个有效参数。

我们先来看下已经实现的前端校验:

此时可以发现,前端是做了空串判断的:

为了方便于后面的内容进行讲解,此时我要把前端校验放过去,所以需要制造一个bug:

然后添加时就报错了:

这是在参数比较多的时候,可以定义一个实体类接收,然后使用@Valid 来做后端校验,如果参数只有一个的时候呢,专门定义一个实体类来接收就没有必要了,还是这个接口,我们做个修改:

不仅是空格串(比如:【  "     "】),如果参数是空串(比如:【""】),那么请求也是能够成功的:

还是之前那个请求,发送之后,后台接收的就是一个空格串,此时后台还需要对这个参数调用 StringUtils.isBlank()方法来判断的,如果仅仅是这一个接口也就罢了,问题是后续开发的很多接口,可能都需要这样检验,这样就会产生很多无关我们业务的操作,无疑也是增加开发人的工作量。令人无奈的是,这个操作我们又不得不做:

鉴于此,我们就有必要写一个过滤器,对请求参数做一个字符串首尾空格去除的过滤了,只需要添加下面三个类:

这里值得关注的一个操作是,如果参数是空串或者空格,那么就不应该将这个参数名传给后端,通俗点说:如果前端传来的值是【name=""】,那么经过过滤之后,传给后端控制器的参数的map集合中,是没有key为"name"的这个键值对的:

当然了,一些接口,比如静态资源相关的接口,则没必要做参数过滤:

将这三个类引入进来后,重启服务器,还是用之前的请求测试,此时就会抛出异常了,这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值