使用spring-boot-starter-validation进行后端校验
场景:
用户在注册时输入用户名和密码,实现对密码的强度校验,要求: 数字、字母、大小写、特殊符号至少包含3个
springboot引入依赖
<!-- spring validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
创建一个自定义注解接口
package com.javakc.platform.components.validation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* validation - 自定义的写到实体类中 - 在保存实体类时加注解校验 密码强度
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME) //程序运行的时候来进行校验 注解接口需要实现类
@Constraint(validatedBy = PasswordValidator.class) //spring-boot-starter-validation中的指定注解实现类 --- 密码强度校验来这 - 找实现类
//注解指定自定义注解中的子注解list-中的value属性
@Repeatable(value = Password.List.class)
public @interface Password {
//直接使用的属性 在括号里
String message() default "";
Class<?>[] groups() default {};
//Payload是spring-boot-starter-validation中的
Class<? extends Payload>[] payload() default {};
//Password注解中通过指定一个子注解来 声明里面的一个类似属性的东西 --- value是你输入的密码
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME) //程序运行的时候来进行校验
@interface List{
Password[] value();
}
}
创建@Constraint指定的实现类PasswordValidator
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @author ypc
* @desc 自定义密码注解的实现类 -- 基于spring-boot-starter-validation 实现接口 在用户输入的密码校验那里 强度的校验
* @date
*/
public class PasswordValidator implements ConstraintValidator<Password,String> {
//数字
public static final String NUMBER = ".*\\d+.*";
//小写字母
public static final String UPPERCASE = ".*[A-Z]+.*";
//大写字母
public static final String LOWERCASE = ".*[a-z]+.*";
//特殊符号
public static final String SYMBOL = ".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*";
/**
* 重写校验方法 -- value是密码
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
//如果字符串里面的值为null, "", " ",那么返回值为false;否则为true str是空的话 就返回false
if (StringUtils.hasText(value)) {
int count = 0;
if (value.matches(PasswordValidator.NUMBER)) count++;
if (value.matches(PasswordValidator.LOWERCASE)) count++;
if (value.matches(PasswordValidator.UPPERCASE)) count++;
if (value.matches(PasswordValidator.SYMBOL)) count++;
return count > 2; //count大于2 就返回
}
return false; //密码为空的话 返回false
}
}
使用 在controller添加注解@Valid 开启校验
保存密码等信息时 就会后台校验密码的强度是否符合要求
@PostMapping
@ApiOperation("用户注册修改")
@LoggerOperation(module = "系统-用户", message = "用户注册修改", type = LoggerEnumerate.INSERT_UPDATE)
public void save(@RequestBody @Valid SystemUser entity)
{
systemUserService.saveUpdate(entity);
}