参数校验---validator

目录

  • 背景
  • 重要性
  • 最佳实践--springboot
    • pom文件
    • 实体类(领域模型)
    • Controller 层
  • 类型对比
  • 参考文章

背景

开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码
这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已,太过冗余,所以参数校验营运而生
参数校验---validator_第1张图片

重要性

估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。其实这是错误的,学过 Web 安全的都知道,客户端的验证只是第一道关卡。它的参数验证并不是安全的,一旦被有心人抓到可乘之机,他就可以有各种方法来摸拟系统的 Http 请求,访问数据库的关键数据。轻则导致服务器宕机,重则泄露数据。所以,这时就需要设置第二道关卡,服务端验证了。

最佳实践–springboot

pom文件



    org.springframework.boot
    spring-boot-starter-web



    org.springframework.boot
    spring-boot-starter-test
    test



    org.projectlombok
    lombok
    true

实体类(领域模型)

这里也很好的体现了领域模型

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private Integer id;

    @NotBlank(message = "学生名字不能为空")
    @Length(min = 2, max = 10, message = "name 长度必须在 {min} - {max} 之间")
    private String name;

    @NotNull(message = "年龄不允许为空")
    @Min(value = 0, message = "年龄不能低于 {value} 岁")
    private Integer age;
}

Controller 层

写了两个方法,一个用于校验普通参数,一个用于校验对象

@Validated //开启数据校验,添加在类上用于校验方法,添加在方法参数中用于校验参数对象。(添加在方法上无效)
@RestController
@RequestMapping("/student")
public class ValidateOneController {

    /**
     * 普通参数校验
     * @param name
     * @return
     */
    @GetMapping("/name")
    public String findStudentByName(@NotBlank(message = "学生名字不能为空")
    @Length(min = 2, max = 10, message = "name 长度必须在 {min} - {max} 之间")String name){
        return "success";
    }

    /**
     * 对象校验
     * @param student
     * @return
     */
    @PostMapping("/add")
    public String addStudent(@Validated @RequestBody Student student){
        return "success";
    }
}

类型对比

1.使用lombok
聊聊lombok构造模式的参数校验
2.使用Bean Validation
内置约束
参数校验---validator_第2张图片
3.使用Hibernate Validator
Hibernate Validator 附加的约束:
参数校验---validator_第3张图片
4.使用Spring Validator

参考文章

SpringBoot 实战 (十五) | 服务端参数校验之一
SpringMVC 参数校验最佳实践

你可能感兴趣的:(♫,基础知识)