Bo(business object)
封装业务对象的属性
因为验证登录注册需要手机号验证码 我们封装一个手机号验证码的BO
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; public class RegisterLoginBO { @NotBlank(message = "手机号不能为空") private String mobile; @NotBlank(message = "验证码不能为空") private String smsCode; public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String getSmsCode() { return smsCode; } public void setSmsCode(String smsCode) { this.smsCode = smsCode; } }
Vaild 注解以及BindingResult类
当对类中的字段进行校验我们一般有两种方法
方法一: 在业务代码中直接使用if语句判断字段是否为空 但是这种方法不好 会导致代码冗余度高
方法二: 使用vaild注解 交给spring处理即可
导包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
@Null
限制只能为null
@NotNull
限制必须不为null
@AssertFalse
限制必须为false
@AssertTrue
限制必须为true
@DecimalMax(value)
限制必须为一个不大于指定值的数字
@DecimalMin(value)
限制必须为一个不小于指定值的数字
@Digits(integer,fraction)
限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future
限制必须是一个将来的日期
@Max(value)
限制必须为一个不大于指定值的数字
@Min(value)
限制必须为一个不小于指定值的数字
@Past
限制必须是一个过去的日期
@Pattern(value)
限制必须符合指定的正则表达式
@Size(max,min)
限制字符长度必须在min到max之间
@Past
验证注解的元素值(日期类型)比当前时间早
@NotEmpty
验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank
验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email
验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
在类中添加即可
之后在controller方法中添加vaild注解即可
BindingResult 类中封装的valid注解中引发的错误
boolean hasErrors();中判断是否有错误
bindResult.getFieldErrors(); 获取所有字段
fieldError.getField() 获取字段
fieldError.getDefaultMessage()) 获取错误
因为别的controller可能会用到此方法 所以要封装到baseController中
/** * 循环取出BO中的错误并返回 * @param bindResult * @return */ protected Map<String, String> getBindResultErrors(BindingResult bindResult) { Map<String, String> errorsMap = new HashMap<>(); List<FieldError> fieldErrors = bindResult.getFieldErrors(); fieldErrors.forEach((fieldError -> { errorsMap.put(fieldError.getField(), fieldError.getDefaultMessage()); })); return errorsMap; }
验证思路
首先判断字段是否合法 也就是手机号和验证码是否为非空
其次redis中的字段是否匹配
@Override public GraceJSONResult doLogin(RegisterLoginBO registerLoginBO, BindingResult bindResult) { // 01 首先判断字段是否有错 if (bindResult.hasErrors()) { Map<String, String> bindResultErrors = getBindResultErrors(bindResult); return GraceJSONResult.errorMap(bindResultErrors); } // 02 判断手机号和验证码是否匹配 String mobile = registerLoginBO.getMobile(); String smsCode = registerLoginBO.getSmsCode(); String redisSMSCode = redisOperator.get(MOBILE_SMS_CODE + ":" + mobile); if (StringUtils.isBlank(redisSMSCode) || !smsCode.equals(redisSMSCode)) { return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR); } return GraceJSONResult.ok(); }
首先获取到手机号 验证码
在根据手机号获取到redis中的验证码
判断验证码是否为空 也就是在redis中查询不到
其次在判断前端传入的验证码是否和redis中的验证码匹配 若匹配直接返回ok