• 后端校验简单聊聊


    背景

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

    image-20220822232556536

    image-20220822232636596

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

    image-20220822232724107

    效果如图

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

    以前天真的我也是这样认为的,直到一次,遇到接口被用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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    简单使用和常用场景

    我们来实现对新增一个对象的入参校验

    @Validated
    @RestController
    public class TestController
    {
        @PostMapping
        public AjaxResult add(@Valid @RequestBody ProjectAddVo projectAddVo)
        {
            return "一个成功的返回";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    需要开启校验,我们需要注意两个注解 @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;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

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

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

    Decimal 的校验

    @Digits(integer = 9, fraction=2, message = "price格式不正确")
        @DecimalMin(value = "0.00", message = "price格式不正确")
        @NotNull(message = "price不为空")
        private BigDecimal garagePrice;
    
    • 1
    • 2
    • 3
    • 4

    嵌套对象的校验

    /**
         * 维修项目列表
         */
        @ApiModelProperty(value = "维修项目列表")
        private List<@Valid ReportBodyVo> reportBodyList;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意 @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());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    展望

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

  • 相关阅读:
    计算机毕业设计java毕业设计项目源代码精品SSM学生选课系统[包运行成功]
    【微信小程序】实现页面跳转功能
    分类预测 | MATLAB实现SSA-CNN-BiGRU-Attention数据分类预测(SE注意力机制)
    字词拼音查询易语言代码
    猿创征文|一个真正的后端鳗的开发工具
    isa-l 中 ec_init_tables() 的用途
    原型和原型链
    java头歌-java中的异常
    量子计算(十一):常见逻辑门以及含义
    [maven] scopes & 管理 & profile & 测试覆盖率
  • 原文地址:https://blog.csdn.net/qq_39007838/article/details/126475822