微服务中架构下的验证码与发送


主要内容:

  1. 图片验证码,点击图片重新生成
  2. 后端生成验证码,手机短信发送

一.图片验证码

生成验证码之后是需要保存到redis的,因为后面获取手机验证码的时候要校验图片验证码是否正确

/**
 * @param code 前端生成的随机码,用于作为redis的key
 * @return
 * @throws IOException
 */
@Override
public String verifiyImage(String code) throws IOException {
    //往redis中存
    String uuid = UUID.randomUUID().toString().substring(0, 4);
    AjaxResult ajaxResult = redisFeignClient.setEx(code, uuid);
    if (!ajaxResult.isSuccess()) {
        throw new RuntimeException("redis存验证码时发生错误");
    }
    //这个时候redis已经有了验证码值,现在将这个验证码输入到图片上
    return VerifyCodeUtils.verifyCode(VerifiyCodeConstant.IMAGE_WIGHT, VerifiyCodeConstant.IMAGE_HEIGHT, uuid);
}

二.手机短信发送验证码

/**
 * @param smsCodeDTO
 * private Long mobile;
 * private String imageCode;
 * private String imageCodeKey;
 */
@Override
public void sendSmsCode(SmsCodeDTO smsCodeDTO) {
    //1.判断之前的图片验证码是否正确
    String imageCode = smsCodeDTO.getImageCode();
    if (null == imageCode || "".equals(imageCode)) {
        throw new RuntimeException("前端保存的图片验证码不合理");
    }
    AjaxResult ajaxResult = redisFeignClient.get(smsCodeDTO.getImageCodeKey());
    if (!ajaxResult.isSuccess()) {
        throw new RuntimeException("验证码已经超时");
    }
    String imageCodeFromRedis = ajaxResult.getResultObj().toString();
    if (!imageCodeFromRedis.equals(imageCode)) {
        throw new RuntimeException("验证码输入错误");
    }
    //2.全部都正确了,就开始获取短信校验码
    String verifiyRandomString = StrUtils.getRandomString(5);
    //3.将"sms"+手机号作为key设置到redis
    //在此之前得先查看redis中有没有这个key
    String smsVerifiyRedisKey = "sms" + smsCodeDTO.getMobile();
    AjaxResult lastResult = redisFeignClient.get(smsVerifiyRedisKey);
    Date date = new Date();
    if (lastResult.isSuccess() && lastResult.getResultObj() != null) {
        String oldVerifiyRandomString = lastResult.getResultObj().toString();
        SmsSendDTO oldSmsSendDTO = JSON.parseObject(oldVerifiyRandomString, SmsSendDTO.class);
        if (StringUtils.hasLength(oldVerifiyRandomString)) {
            if (((date.getTime() - oldSmsSendDTO.getCreateTime().getTime()) < 60000)) {
                throw new RuntimeException("频繁发送短信");
            } else {
                redisFeignClient.setEx(smsVerifiyRedisKey, JSON.toJSONString(oldSmsSendDTO));
            }
        } else {
            throw new RuntimeException("redis取数据出现错误");
        }
    }
    //表示redis中从没添加过这个key或者说该key因为过期被redis删除了
    //重新设置
    SmsSendDTO nowSmsSendDTO = new SmsSendDTO();
    nowSmsSendDTO.setCreateTime(date);
    nowSmsSendDTO.setMobile(smsCodeDTO.getMobile());
    nowSmsSendDTO.setVerifiyRandomString(verifiyRandomString);
    redisFeignClient.setEx(smsVerifiyRedisKey, JSON.toJSONString(nowSmsSendDTO));
    String sendMessage = "您的注册验证码为[" + verifiyRandomString + "],请在5分钟内使用";
    System.out.println(sendMessage);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值