springboot 实现用户注册时,通过短信验证码验证短信的功能,后台代码是怎么实现的?保存在 session中的吗?能帮我写个示例代码吗

1. springboot 实现用户注册时,通过短信验证码验证短信的功能,后台代码是怎么实现的?保存在 session中的吗?能帮我写个示例代码吗?

实现用户注册时,通过短信验证码验证短信的功能,可以按照以下步骤进行:

  1. 前端页面发送手机号码到后台,后台返回一个随机的验证码,并将验证码保存到 redis 缓存中,同时将手机号码和验证码的对应关系也保存到 redis 缓存中,有效期为 5 分钟。

  2. 前端页面将手机号码和验证码一起提交到后台,后台通过调用 redis 缓存中的数据来验证验证码是否正确,如果正确,则创建新用户,否则返回错误提示。

这里给出一个使用 Spring Boot 和 Redis 实现用户注册时,通过短信验证码验证短信的示例代码:

@RestController
public class UserController {
    
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
    // 发送验证码
    @GetMapping("/sendSms")
    public String sendSms(@RequestParam String phone) {
        // 生成验证码
        String code = String.valueOf(new Random().nextInt(899999) + 100000);
        // 保存验证码到redis缓存中
        redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
        // 发送验证码的逻辑,这里不展开
        return "验证码已发送成功!";
    }
    
    // 用户注册
    @PostMapping("/register")
    public String register(@RequestParam String phone, @RequestParam String code) {
        String verifyCode = redisTemplate.opsForValue().get(phone);
        if (StringUtils.isNotEmpty(verifyCode) && StringUtils.equals(code, verifyCode)) {
            // 验证码验证通过,创建新用户,这里不展开
            return "注册成功!";
        } else {
            return "验证码错误!";
        }
    }
}

上述代码中,使用 RedisTemplate 提供的 opsForValue() 方法来操作 Redis 缓存,并使用字符串存储验证码。验证码的有效期为 5 分钟。在发送验证码时,将验证码保存到 Redis 缓存中,然后返回”验证码已发送成功”的信息。在用户注册时,从 Redis 缓存中获取验证码,并和用户输入的验证码比较,如果一致,则创建新用户,否则返回”验证码错误”的错误信息。

2. 我没有买 Redis的服务,能用最简单的JAVA代码 也实现一个版本吗?

如果没有 Redis 服务的话,也可以使用最简单的 Java 代码实现用户注册时通过短信验证码验证的功能。这里简单介绍一个实现方式:

  1. 前端页面发送手机号码到后台,后台返回一个随机的验证码,并将验证码保存在一个 Map 类型的变量中,同时将手机号码和验证码的对应关系也保存在 Map 中,有效期为 5 分钟。

  2. 前端页面将手机号码和验证码一起提交到后台,后台通过从 Map 中取出数据来验证验证码是否正确,如果正确,则创建新用户,否则返回错误提示。

以下是示例代码,可以按照自己的需求进行修改:

@RestController
public class UserController {

    private static final Map<String, String> codeMap = new HashMap<>();

    // 发送验证码
    @GetMapping("/sendSms")
    public String sendSms(@RequestParam String phone) {
        // 生成验证码
        String code = String.valueOf(new Random().nextInt(899999) + 100000);
        // 将验证码和手机号码的对应关系保存到一个 Map 中,有效期为 5 分钟
        codeMap.put(phone, code);
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                codeMap.remove(phone);
            }
        };
        new Timer().schedule(task, 5 * 60 * 1000);
        // 发送验证码的逻辑
        return "验证码已发送成功!";
    }

    // 用户注册
    @PostMapping("/register")
    public String register(@RequestParam String phone, @RequestParam String code) {
        String verifyCode = codeMap.get(phone);
        if (StringUtils.isNotEmpty(verifyCode) && StringUtils.equals(code, verifyCode)) {
            // 验证码验证通过,创建新用户,这里不展开
            return "注册成功!";
        } else {
            return "验证码错误!";
        }
    }
}

上述代码中,使用一个 Map 对象来保存验证码和手机号码的对应关系,并设置有效期为 5 分钟。在发送验证码时,将验证码保存到 Map 中,并使用定时器来删除失效的数据。在用户注册时,从 Map 对象中获取验证码,并和用户提交的验证码进行比较,如果一致,则创建新用户,否则返回”验证码错误”的错误信息。

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注