数据效验一般分为前端效验和后端效验,有些小伙伴可能觉得,前端做了效验,后端还有必要做效验吗?这个认知其实是错误的,后端对于前端提交的数据,都是不信任的,都需要重新效验,因为可以通过其他手段绕过前端效验,把不安全的数据提交给后端处理。
- 后端添加效验很简单,我们只需把表单对象,添加相应的注解,也就是通过添加注解指定效验规则,如下所示:
public class SysPostVO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "id")
private Long id;
@Schema(description = "岗位编码", required = true)
@NotBlank(message = "岗位编码不能为空")
private String postCode;
@Schema(description = "岗位名称", required = true)
@NotBlank(message = "岗位名称不能为空")
private String postName;
@Schema(description = "排序", required = true)
@Min(value = 0, message = "排序值不能小于0")
private Integer sort;
@Schema(description = "状态 0:停用 1:正常", required = true)
@Range(min = 0, max = 1, message = "状态不正确")
private Integer status;
}
- 下面是比较常用的校验注解,如下所示:
@Null 被注解的元素必须为null
@NotNull 被注解的元素必须不为null
@NotEmpty 被注释的字符串的必须非空
@NotBlank 验证字符串非null,且长度必须大于0
@AssertTrue 被注解的元素必须为true
@AssertFalse 被注解的元素必须为false
@Min(value) 被注解的元素必须为数字,其值必须大于等于最小值
@Max(value) 被注解的元素必须为数字,其值必须小于等于最小值
@Size(max,min) 被注解的元素的大小必须在指定范围内
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Email 被注释的元素必须是电子邮箱地址
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
- 然后通过@Valid注解,在Controller层进行处理的,如下所示:
@PostMapping("/sys/post")
public Result<String> save(@RequestBody @Valid SysPostVO vo){
sysPostService.save(vo);
return Result.ok();
}
-
完成上面的步骤后,后端就可以处理表单数据效验了。
-
备注:如果是其他项目,还需要对异常进行捕获,我们这个框架,已经做了统一异常处理,就不用再处理了,代码如下所示:
@RestControllerAdvice
public class ServerExceptionHandler {
/**
* SpringMVC参数绑定,Validator校验不正确
*/
@ExceptionHandler(BindException.class)
public Result<String> bindException(BindException ex) {
FieldError fieldError = ex.getFieldError();
assert fieldError != null;
return Result.error(fieldError.getDefaultMessage());
}
}