在前后端分离开发的场景下,分为前端校验和后端校验。前端校验我们一般比较熟悉,以我们比较熟悉的vue2和elementui为例,一般是在表单元素上添加,绑定一个rule。

然后在提交按钮绑定的函数上调用validate方法校验

效果如图
我们已经有了前端校验,为什么还需要后端校验呢
以前天真的我也是这样认为的,直到一次,遇到接口被用api工具恶意攻击,简单描述下,就是在提交单据前,手动修改提交的修改的json串,绕开了字段规则,本来是数字的字段,填入了其他数据,或者非空字段写null。要是被有心人利用,后果基本上是毁灭性的。
这里需要注意一个点,你的 SpringBoot 版本问题,上一篇文章中也提到过,在 2.3.3 版本以后,hibernate-validator 的不再默认提供,我这边Springboot用的 2.5.14,需要自己额外添加两个注解
<dependency>
<groupId>javax.validationgroupId>
<artifactId>validation-apiartifactId>
dependency>
<dependency>
<groupId>org.hibernate.validatorgroupId>
<artifactId>hibernate-validatorartifactId>
dependency>
我们来实现对新增一个对象的入参校验
@Validated
@RestController
public class TestController
{
@PostMapping
public AjaxResult add(@Valid @RequestBody ProjectAddVo projectAddVo)
{
return "一个成功的返回";
}
}
需要开启校验,我们需要注意两个注解 @Validated @Valid
下面对常见类型的校验规则做下简单说明
@Data
public class ProjectAddVo {
/**
* 关联公司 id
*/
@ApiModelProperty(value = "销售公司", required = true, example = "1")
@NotNull(message = "销售公司不可为空")
private Long companyId;
/**
* 在推产品
*/
@ApiModelProperty(value = "在推产品", required = true, example = "1")
@NotEmpty(message = "在推产品不可为空")
private Long[] productIds;
@ApiModelProperty(value = "备注", example = "我是一个备注")
@NotBlank(message = "备注不可为空")
private String note;
}
其实出现的最多就是这三个
@Digits(integer = 9, fraction=2, message = "price格式不正确")
@DecimalMin(value = "0.00", message = "price格式不正确")
@NotNull(message = "price不为空")
private BigDecimal garagePrice;
/**
* 维修项目列表
*/
@ApiModelProperty(value = "维修项目列表")
private List<@Valid ReportBodyVo> reportBodyList;
注意 @Valid 注解 添加位置即可
org.springframework.web.bind.MethodArgumentNotValidException 全局抓取处理这个错误即可
/**
* 方法参数校验
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ReturnVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
log.error(e.getMessage(), e);
return new ReturnVO().error(e.getBindingResult().getFieldError().getDefaultMessage());
}
后面还有分组校验和自定义注解,等后面再来补充