使用tinyvalidator实现服务器端验证 -Yuri Mednikov


向您演示一个小的tinyvalidator库,tinyvalidator库是执行验证流程的小型简单解决方案,该库可以在处理程序级别用于验证输入。

定义数据模型
验证从所需数据及其参数的定义开始。tinyvalidator使用基于注释的方法。

public class AuthRequest {

    @Email
    private String email;

    @Size(min = 8)
    private String password;

    // getters, setters
}

在此代码段中,我们使用了两个注释:@Email和@Size。第一个检查字段是否包含有效的电子邮件地址(尽管这适用于format。您需要实施电子邮件确认流程来检查此电子邮件确实存在)。第二个断言password字符串的长度不小于8。
您的API中可能还需要使用许多其他有用的内置验证器注释:

  • @NotNull –检查字段是否为空
  • @HttpUrl –检查字段是否包含有效的网址
  • @Pattern –接受与定义的常规表达式匹配的字段

构建验证流程的第二部分实际上是调用验证器组件,该组件根据定义的规则对bean进行断言:

public void login(Context context) {
    Validator validator = new Validator();
    AuthRequest request = context.bodyAsClass(AuthRequest.class);
    List<ConstraintViolation> violations = validator.validate(request);
    if (!violations.isEmpty()) {
        String message = violations.stream()
            .map(v -> v.getName().concat(": ").concat(v.getMessage()))
            .collect(Collectors.joining(
", "));
        throw new BadRequestResponse(message);
    }
    AuthResponse result = service.login(request);
    context.json(result);
}

public void signup (Context context){
    AuthRequest request = context.bodyAsClass(AuthRequest.class);
    Validator validator = new Validator();
    List<ConstraintViolation> violations = validator.validate(request);
    if (!violations.isEmpty()) {
        String message = violations.stream()
            .map(v -> v.getName().concat(
": ").concat(v.getMessage()))
            .collect(Collectors.joining(
", "));
        throw new BadRequestResponse(message);
    }
    AuthResponse result = service.signup(request);
    context.json(result);
}

首先,我们在该方法中需要创建一个新validator实例:

Validator validator = new Validator();

然后,我们需要将bean传递给验证器。在我们的例子中,bean代表一个登录/注册请求(AuthRequest实体):

List<ConstraintViolation> violations = validator.validate(request);

这种方法基本上返回一个包含验证不通过的Collection。如果bean有效,则此Collection为空。否则,我们将获得没有通过验证的字段。在这种情况下,我们需要中断带有BadRequest响应的处理程序流,然后是有关错误消息。

您可以在github存储库中找到此文章的完整源代码。