参数验证很重要,是开发环节中不可少的一部分,但是有些很多后端同事会偷懒,干脆不做,这样很可能给系统的稳定性和安全性带来严重的危害。那么在SpringBoot应用中如何做好参数校验工作呢,本文来介绍一下参数验证的技巧。
使用SpringBoot自带注解验证
SpringBoot提供了内置的验证注解,可以帮助我们简单高效的验证参数,包括参数是否为NULL,是否为空串或者空格等等,也有特定格式参数的验证,例如邮箱格式或者符合某个正则的格式。
一些最常用的验证注释包括:
@NotNull:指定字段不能为空。
@NotEmpty:指定列表字段不能为空。
@NotBlank:指定字符串字段不得为空或仅包含空格。
@Min 和 @Max:指定数字字段的最小值和最大值。
@Pattern:指定字符串字段必须匹配的正则表达式模式。
@Email:指定字符串字段必须是有效的电子邮件地址。
举个例子,如果我们有一个实体类user,我们可以对user的各个字段的格式进行校验:
less
public class User {
@NotNull(message = "用户id不能为空")
private Long id;
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 50)
private String firstName;
@NotBlank
@Size(min = 2, max = 50)
private String lastName;
@Email(message = "邮箱格式不正确")
private String email;
@NotNull
@Min(value = 18, message = "年龄必须大于18")
@Max(value = 99, message = "年龄必须小于99")
private Integer age;
@Pattern(regexp = "[A-Z]{2}\d{4}")
private String employeeId;
}
添加完验证条件之后就是怎么触发这些验证,我们只需要用到@Valid注解,下面是一个针对用户的controller,我们只需要在User请求体的前面加上@Valid注解就可以触发验证了。
less
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/")
public ResponseEntity<?> createUser(@RequestBody @Valid User user) {
// 逻辑处理
return ResponseEntity.ok("User created");
}
}
自定义注解验证
上面介绍的是我们常用的一些验证注解,如果我们需要自定义一个验证逻辑该怎么做呢,这个时候就需要我们自定义验证注解了。例如,上面的user实体类中有一个密码password属性,密码格式为大于八位且包含数字大写字母小写字母。那么这个自定义注解怎么写呢?
首先,我们需要定义一个注解@ValidPassword
less
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidPasswordValidator.class)
public @interface ValidPassword {
String message() default "密码格式不正确!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
然后定义验证器
typescript
public class ValidPasswordValidator implements ConstraintValidator<ValidPassword, String> {
@Override
public void initialize(ValidPassword constraintAnnotation) {
// 初始化,如有需要
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
boolean hasUppercase = value.chars().anyMatch(Character::isUpperCase);
boolean hasLowercase = value.chars().anyMatch(Character::isLowerCase);
boolean hasDigit = value.chars().anyMatch(Character::isDigit);
return value.length() >= 8 && hasUppercase && hasLowercase && hasDigit;
}
}
我们验证逻辑都写在了isValid方法中,initialize方法中可以做一些配置或设置工作。
最后一步我们就可在user类中使用我们自定义的注解了,使用方法和触发方法和上面的SpringBoot的验证注解是一样的。
kotlin
public class User {
@ValidPassword
private String password;
//其他属性
}
以上两种方法就是我们常用的参数验证的方法。