Java教程

验证短信登录或注册

本文主要是介绍验证短信登录或注册,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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格式

在类中添加即可
image

之后在controller方法中添加vaild注解即可

BindingResult 类中封装的valid注解中引发的错误
image

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

这篇关于验证短信登录或注册的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!