Skip to content
DAILY QUOTE

“ ”

发送手机验证码页面流程

发送验证码:

java
/**
 * 发送短信验证码。
 *
 * @param phone手机号
 * @param session当前Session对象
 * @return处理结果
 */
@PostMapping("code")
public Result sendCode(@RequestParam("phone") String phone, HttpSession session) {
    // TODO发送短信验证码并保存验证码
    //return Result.fail("功能未完成");
    return userService.sendCode(phone, session);
}

/**
 * 发送短信验证码。
 *
 * 作用:
 * 1.检验手机号格式是否正确;
 * 2.格式不对,返回错误信息;
 * 3.格式正确,生成验证码;
 * 4.保存验证码到Session;
 * 5.模拟发送短信验证码;
 *
 * @param phone手机号
 * @param session当前Session对象
 * @return处理结果
 */
@Override
public Result sendCode(String phone, HttpSession session) {
    //检验手机号格式是否正确
    if(!RegexUtils.isPhoneInvalid(phone)) {
        //格式不对,返回错误信息
        return Result.fail("手机格式错误");
    }
    //格式正确,生成验证码
    String code= RandomUtil.randomNumbers(6);
    //保存验证码到session
    session.setAttribute(phone,code);
    //模拟发送短信验证码
    log.debug("向{}发送短信验证码成功,验证码:{}",phone,code);
    //返回ok
    return Result.ok();
}

真实短信业务参见:短信服务-短信服务-阿里云

登录页面流程

登录与注册:

java
/**
 * 校验验证码并完成登录。
 *
 * 作用:
 * 1.检验手机号是否一致,不同请求,保持一致;
 * 2.校验验证码;
 * 3.如果没有发送验证码,或者验证码不一致;
 * 4.不一致,返回错误;
 * 5.一致,根据手机号查询用户;
 *
 * @param loginFormDTO登录表单DTO
 * @param session当前Session对象
 * @return处理结果
 */
@Override
public Result login(LoginFormDTO loginFormDTO, HttpSession session) {
    //检验手机号是否一致,不同请求,保持一致
    String phone=loginFormDTO.getPhone();
    if(!RegexUtils.isPhoneInvalid(phone)) {
        return Result.fail("手机号格式错误");
    }
    //校验验证码
    Object cacheCode=session.getAttribute(phone);
    String code=loginFormDTO.getCode();
    //如果没有发送验证码,或者验证码不一致
    if(cacheCode==null||!cacheCode.toString().equals(code)) {
        //不一致,返回错误
        return Result.fail("验证码错误");
    }
    //一致,根据手机号查询用户
    User user=query().eq("phone",phone).one();
    //如果用户不存在,创建用户
    if(user==null){
        user=createUserWithPhone(phone);
    }
    //保存用户到Session   //转为DTO类型,传统方法new,然后一个个设置,工具类更方便
    session.setAttribute("user", BeanUtil.copyProperties(user, UserDTO.class));
    //前端cookie携带了sessionId不需要再返回sessionId了
    return Result.ok();
}

/**
 * 根据手机号创建新用户。
 *
 * @param phone手机号
 * @return处理结果
 */
private User createUserWithPhone(String phone) {
    User user=new User();
    user.setPhone(phone);
    user.setNickName(SystemConstants.USER_NICK_NAME_PREFIX+RandomUtil.randomString(6));
    save(user);
    return user;
}