使用Session+Hutool简单实现手机验证码

839 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
什么是Session
首先,Session是服务器端技术,我们可以利用这个技术,在每一次服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,且session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。如下图所示

Snipaste_2022-12-21_19-18-34.jpg 什么是Hutool
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率。
官网为:Hutool
Maven坐标为:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.17</version>
</dependency>

本次使用Hutool用来生成验证码,使用方法如下:

RandomUtil.randomNumbers(int length) -------随机生成长度为 length的 数字字符串
RandomUtil.randomString(int length) -------随机生成长度为 length的 数字和字符字符串
RandomUtil.randomInt() -------随机生成一个Int类型的一个数字
.... 这里还有很多方法,小编不一一介绍了!
使用Session和Hutool完成短信登陆
小编思路: 准备一个前端页面,用户输入验证码,然后点击发送短信,使用Axios发送短信,使用RandomUtil.randomNumbers(4) 生成一个四位验证码,然后使用Session的 setAttribute将验证码存储到Session,然后用户点击登录时候,将用户输入的验证码与session的验证码相对比,如果正确,则登录,不正确则视为验证码错误。 发送验证码代码:

public Result sendCode(String phone, HttpSession session) {
    //1.校验手机号 调用工具类
    if(RegexUtils.isPhoneInvalid(phone)){
        //2.查看是否符合 如果不符合 提示手机号错误
        return  Result.fail("手机号码格式错误!");
    }
    //3. 符合 生成验证码
    String code = RandomUtil.randomNumbers(4);
    //4.发送验证码
log.debug("发送验证码成功!验证码为:"+code);
    //5. 将验证码保存到session
session.setAttribute("code",code);
    //5.返回
    return  Result.ok();
}

校验验证码是否正确代码

@Override
public Result login(LoginFormDTO loginForm, HttpSession session) {
   //1.校验手机号
    String phone = loginForm.getPhone();
    if(RegexUtils.isPhoneInvalid(phone)){
        //2.查看是否符合 如果不符合 提示手机号错误
        return  Result.fail("手机号码错误!");
    }
    //2.校验验证码
    String code =loginForm.getCode();
    String sessioncode = (String)session.getAttribute("code");

    //3.如果验证码不一致 提示错误
    if (session==null||!sessioncode.toString().equals(code)){
    return Result.fail("验证码错误!");
    }
    //4.验证码一致 判断数据库中是否由此用户
    User user = this.query().eq("phone", phone).one();
    if (user==null){
        //5.数据库中没有 创建新的用户 并保存在数据库中
           user = createUserByPhone(phone);
    }
    //6.数据库中有 继续下一步
    //7.将新用户或者旧信息保存在session中
    session.setAttribute("user",BeanUtil.copyProperties(user, UserDTO.class));
    //5.返回
    return  Result.ok();
}