Spring Validation 数据验证实现

1.Spring validation的作用

1)关于Sql注入:就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符 串,最终达到欺骗服务器执行恶意的 SQL 命令。

2)防止Sql注入:(1)永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式, 或限制长度,对单引号和双"-"进行转换等。(2)永远不要使用动态拼装 SQL,可以使用参数化的 SQL 或者直接使用存储过程 进行数据查询存取。(3) 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的 数据库连接。(4)不要把机密信息明文存放,请加密或者 hash 掉密码和敏感的信息。(5)  应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原 始错误信息进行包装,把异常信息存放在独立的表中。

3)因此便需要用到Spring Validation,而Spring Validation的主要作用是检查请求参数的基本格式。

2.关于检查请求参数

在开发实践中,无论是客户端的项目(例如网页前端),还是服务器端的项目,都需要对用户填写、选择的数据进行检查!

其实,最终能够保证数据有效的一定是服务器端的检查,所以,服务器端必须对请求参数进行检查,仅当数据的基本格式有效后,才进行相关的处理。

客户端的检查应该是不作为最终保障的,在前后端分离的模式下,服务器端无法保证所有客户端都采取了统一、有效的验证规则!因为客户端的检查可能并未实现、用户设备中客户端软件的版本并未升级,甚至,客户端软件是可能伪造、篡改的。

即使客户端的检查不一定是可靠的,但是,所有客户端仍应该对请求参数进行检查,如果参数的基本格式不符合要求,则不应该提交请求!毕竟客户端的检查可以把绝大部分错误拦截掉(不会低级错误的请求发到服务器端),以减轻服务器端的压力。

3.添加依赖

在Spring Boot项目中,使用Spring Boot Validation的依赖项是:

<!-- Spring Boot Validation:用于检查请求参数的基本格式 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

4.基本使用

在控制器处理请求的方法中,对需要验证的请求参数添加`@Valid`或`@Validated`注解,表示此参数是需要通过Spring Boot Validation进行检查的,例如:

@PostMapping("/add-new")
public JsonResult addNew(@RequestBody @Valid BrandAddNewDTO brandAddNewDTO) {
    brandService.addNew(brandAddNewDTO);
    return JsonResult.ok();
}

在封装了请求参数的POJO类中,在各需要验证格式的属性之前,添加检查格式的注解,即可实现格式的验证,例如:

@ApiModelProperty(value = "品牌名称", required = true, example = "华为")
@NotNull
private String name;

5.关于检查参数格式的注解

@NotNull:不允许为`null`,即必须提交此名称对应的参数

  注意:适用于基本数据类型(Integer,Long,Double等等)

@NotEmpty:不允许为空字符串(长度为0的字符串)

 注意:适用于数组或集合类型属性上判断当前数组或集合不能为null并且长度不能为0

@NotBlank:不允许为空白(字符串长度可能大于0,却是由空格、TAB等空白输入的)

 注意:适用于字符串格式的参数

@Min:设置数值类型的最小值

 仅用于数值类型的请求参数

 可被@Range取代

@Max:设置数值类型的最大值

仅用于数值类型的请求参数

可被@Range取代

@Range:设置数据类型的取值区间,可设置最小值和最大值

此注解的min属性默认为0,max属性默认为long类型的最大值

仅用于数值类型的请求参数

@Pattern:配置正则表达式

不能取代@NotNull注解

在开发实践中,对于字符串类型的请求参数,应该同时使用`@NotNull`(如果你认为必须提交)和@Pattern,而`@NotEmpty`、`@NotBlank`通常不需要使用,除非你对此字符串的值没有太多要求,对于数值类型的请求参数,应该同时使用`@NotNull`和`@Range`。

需要注意:对于数值类型的属性,如果提交的请求参数不能够转换成数值类型,则这些注解将不生效,且报错。

另外,在开发实践中,通常会将使用到的正则表达式、出错时的提示文本封装在专门的类或接口中,各POJO类型直接引用即可。

猜你喜欢

转载自blog.csdn.net/qq_43780761/article/details/126771428
今日推荐