📜  Spring – MVC 自定义验证(1)

📅  最后修改于: 2023-12-03 15:05:16.515000             🧑  作者: Mango

Spring - MVC 自定义验证

在 Web 开发中,常常需要对用户输入的数据进行验证,确保其符合要求并且安全可靠。Spring 提供了丰富的数据验证机制,其中最常用的就是基于注解的数据验证,Spring 还支持自定义数据验证。

基于注解的数据验证

Spring 的 @Valid 注解可以用来验证对象的属性值。在 Controller 中,当请求参数使用 @RequestBody@ModelAttribute 注解时,可以在该对象上使用 @Valid 注解来进行验证。例如:

@PostMapping("/user")
public String addUser(@RequestBody @Valid User user) {
    //用户数据合法,进行保存
    userRepository.save(user);
    return "redirect:/users";
}

这里的 User 对象上使用了 @Valid 注解,表示要对 User 对象的属性进行验证。如果验证失败,会自动返回错误信息。在 User 对象的属性上,可以使用 Spring 自带的数据验证注解,例如:

  • @NotNull:验证不为 null
  • @NotEmpty:验证不为 null 或空字符串
  • @NotBlank:验证不为 null、空字符串或只包含空格
  • @Min:验证数值大于等于指定值
  • @Max:验证数值小于等于指定值
  • @Email:验证是一个合法的邮箱格式

例如:

public class User {

    @NotNull(message = "用户名不能为空")
    private String username;

    @NotEmpty(message = "密码不能为空")
    private String password;

    @Email(message = "邮箱格式不正确")
    private String email;

    //省略get/set方法
}
自定义数据验证

除了使用自带的数据验证注解之外,我们还可以自定义数据验证注解,来验证一些特殊的条件和场景。

自定义数据验证注解需要实现 javax.validation.ConstraintValidator 接口。例如,我们想要验证一个字符串的长度是否大于等于指定值,可以创建一个 @MinLength 注解:

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MinLengthValidator.class)
public @interface MinLength {

    int value();

    String message() default "长度不能小于{value}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

这里的 @Target@Retention 注解用来定义注解的使用范围和生命周期。@Constraint 注解用来指定该注解要使用的验证器类,即 MinLengthValidator 类。

public class MinLengthValidator implements ConstraintValidator<MinLength, String> {

    private int value;

    @Override
    public void initialize(MinLength annotation) {
        this.value = annotation.value();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return value != null && value.length() >= this.value;
    }
}

在自定义的验证器类中,需要实现 initializeisValid 方法。initialize 方法用来初始化注解参数,isValid 方法用来验证数据是否合法。

然后,就可以在 User 类中使用 @MinLength 注解了:

public class User {

    @NotNull(message = "用户名不能为空")
    private String username;

    @NotEmpty(message = "密码不能为空")
    @MinLength(value = 6, message = "密码长度不能小于6")
    private String password;

    @Email(message = "邮箱格式不正确")
    private String email;

    //省略get/set方法
}

这样,就可以通过自定义注解来验证数据了。

总结

Spring 提供了丰富的数据验证机制,其中基于注解的数据验证机制应用最广泛。在使用时,可以根据需求选择合适的数据验证注解,如果没有合适的注解,还可以自定义数据验证注解。通过使用数据验证注解,可以有效地防止恶意用户提交不合法数据,提高网站的安全性和用户体验。