SpringBoot使用Validation库进行后端验证

258 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

为什么要进行后端验证

现在为了节约后端资源,把越来越多的逻辑判断与校验工作放在前端去完成。但是这样同样会带来一个问题:客户端绕过攻击,通过一些工具,甚至浏览器调试工具就可以绕过前端的校验规则,直接去带有不符合规则要求的参数去访问后端接口。这样会造成后端程序错误等问题,从而引发一系列错误吗,甚至安全问题。

解决方法

对于客户端提交表单或者Ajax中的数据,后端的Controller必须先要做验证,然后才能使用这些数据。但是每次都对请求数据进行if校验,会造成大量的代码冗余,而且非常的不优雅。为了解决这一问题,我们可以使用Validation库,来解决相应的问题。

使用Validation库进行后端验证

添加依赖

添加相依的依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-validation</artifactId>
</dependency>

创建Form类

将接收到的参数封装成实体类,使用@ApiModel和@ApiModelProperty让他们在swagger里有相应的注释。 使用各种注解,对接收到的参数进行校验。

@ApiModel
@Data
public class TestSayHelloForm {
    @NotBlank
    @Pattern(regexp = "^[\\u4e00-\\u9fa5]{2,15}$")
	@ApiModelProperty("姓名")
    private String name;
}
序号注解解释
1@NotNull不能为空
2@NotBlank不能为空,且不能为空字符串
3@Min最小值
4@Max最大值
5@Range范围
5@Pattern正则表达式 如:@Pattern(regexp = "^[\u4e00-\u9fa5]{2,15}$")\表示2-15个汉字,[A-Za-z\u4e00-\u9fa5]这是英文

编写测试方法,测试功能

@RestController
@RequestMapping("/test")
@Api("测试Validation库后端验证")
public class TestController {

    @PostMapping("/sayHello")
    @ApiOperation("是否进行了后端校验")
    public R sayHello(@Valid @RequestBody TestSayHelloForm form){
        return R.ok().put("message","Hello,"+form.getName());
    }
}

总结

只是进行前端校验,非常容易被客户端绕过攻击,这是非常不安全的一种做法,使用Validation库对请求参数进行校验,既能完善系统的健壮性,也能解决多个if语句的冗余。