后端校验简单聊聊

背景

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

后端校验简单聊聊_第1张图片

后端校验简单聊聊_第2张图片

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

后端校验简单聊聊_第3张图片

效果如图

我们已经有了前端校验,为什么还需要后端校验呢

以前天真的我也是这样认为的,直到一次,遇到接口被用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;

}

其实出现的最多就是这三个

  • @NotNull 适用于任何类型被注解的元素必须不能与NULL
  • @NotEmpty 适用于String Map或者数组不能为Null且长度必须大于0
  • @NotBlank 只能用于String上面 不能为null,调用trim()后,长度必须大于0

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());
    }

展望

后面还有分组校验和自定义注解,等后面再来补充

你可能感兴趣的:(java,开发语言)