请求参数的校验是很多新手开发非常容易犯错,或存在较多改进点的常见场景。比较常见的问题主要表现在以下几个方面:
- 仅依靠前端框架解决参数校验,缺失服务端的校验。这种情况常见于需要同时开发前后端的时候,虽然程序的正常使用不会有问题,但是开发者忽略了非正常操作。比如绕过前端程序,直接模拟客户端请求,这时候就会突然在前端预设的各种限制,直击各种数据访问接口,使得我们的系统存在安全隐患。
- 大量地使用
if/else
语句嵌套实现,校验逻辑晦涩难通,不利于长期维护。
所以,针对上面的问题,建议服务端开发在实现接口的时候,对于请求参数必须要有服务端校验以保障数据安全与稳定的系统运行。同时,对于参数的校验实现需要足够优雅,要满足逻辑易读、易维护的基本特点。
JSR-303
Bean Validation中内置的constraint
Hibernate Validator附加的constraint
1、校验的字段上添加上@NotNull
注解
表字段与实体类对应关系加@Column注解,请求参数通过实体类接收并校验参数,数据库返回数据通过实体类接受并匹配字段
@Data
@ApiModel(description="用户实体")
public class User {
@ApiModelProperty("用户编号")
private Long id;
@NotNull
@Size(min = 2, max = 5)
@ApiModelProperty("用户姓名")
@Column(name="NAME") //数据库表字段与实体类对应关系
private String name;
@NotNull
@Max(100)
@Min(10)
@ApiModelProperty("用户年龄")
private Integer age;
@NotNull
@Email
@ApiModelProperty("用户邮箱")
private String email;
}
2、校验的参数实体前添加@Valid
注解
返回前端数据封装到Result中,data、code、msg,统一规范,代码清晰,方便联调
@PostMapping("/")
@ApiOperation(value = "创建用户", notes = "根据User对象创建用户")
public Result postUser(@Valid @RequestBody User user) {
users.put(user.getId(), user);
return ResultVo.sucess(suers);
}