声明:本文属原创文章,始发于公号:程序员自学之道,并同步发布于 https://blog.youkuaiyun.com/dadiyang/article/details/90740878 转载请注明出处!
前言
在 Web 开发中, 我们经常需要校验各种参数,这是一件繁琐又重要的事情,对于很多人来说,在做参数校验的时候,会有以下几种类型的处理方式:
甩锅型
校验太麻烦了,让客户端去负责校验就行了,调用方传错了是调用方的问题,不是服务的问题,甩个 500 错误让他们好好反省:
劳模型
有多少参数,我就写多少个 if 语句做判断,校验不通过的都写一句友好的提示,如:
工具型
自己写个参数校验的通用工具,然后每个请求接收到的参数都调用工具方法来校验,校验不通过就把校验结果返回给调用方。这样确实能减少很多冗余的代码:
半自动型
对 SpringMVC 了解比较全面的朋友都知道,它支持 Bean Validation,因此可以通过使用 javax.validation.constraints
包下的注解,如 @NotNull @Max @Min
等,来实现由框架处理数据校验:
首先,添加 hibernate-validator 依赖(SpringBoot 项目为我们自动添加了):
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
然后,在参数对象的字段上打注解:
最后,在 Controller 中给参数对象添加 @Valid 注解,并处理校验结果:
- tip:如果你的参数不是对象,一定要在 Controller 上打 @Validate 注解!
这样做,每个Controller方法进来都要处理结果,也都是冗余的代码。
方案分析
以上这些处理方式都有不足之处:
- 首先,参数校验是一件非常重要的事,客户端要把住第一道防线,而服务方要采取不信任的态度,做好参数校验。否则非法请求参数小则影响用户体验或者产