ruijiege

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1.问题怎么判断是否是同一个手机提交的验证码(保存到redis中通过手机号加一个参数就可以完成保存)

2.redis怎么存储并且判断在一段时间内不能够再发消息(key,contant)contan可以是"time + contant"的字符串,也可以是保存两个字段的对象

  1. 前台发起验证码发送申请(Ajax),并且按钮倒计时、禁用
  2. 后台接收到请求,判断图片验证码是否合法
  3. 判断上一次是否有一个未使用的有效验证码
  4. 如果有,并且过了重发时间(两次发送时间大于60S)使用上一次有效验证码
  5. 如果没有,创建一个新的短信验证码
  6. 把短信验证码存储到Redis,格式如: SMS:18244229575={code:”1234” , sendTime: “mills”}
  7. 调用第三方短信网关发送短信验证码
  8. DB存储验证码发送记录作为结算依据

传入的参数是手机号,图片验证码,及保存图片验证码的seesion值,这样才可以通过该值和找到redis中的值判断工具类在图片验证码有工具类

 

@Override
    public void sendSmsCode(VerifyCodeAndSendPhoneDto dto) {
        //1.前台发起验证码发送申请(Ajax),并且按钮倒计时、禁用
        String imageCode = dto.getImageCode();
        String imageCodeKey = dto.getImageCodeKey();
        String mobile = dto.getMobile();
        //2.后台接收到请求,判断图片验证码是否合法
        //这里一定需要后台验证,因为前台的请求可以跳过
        BasicVerify(imageCode, imageCodeKey, mobile);
        //判断图片验证码时候正确
        AjaxResult ajaxResult = redisFegin.get(imageCodeKey);
        if (!ajaxResult.isSuccess() && ajaxResult.getResultObj()==null){
            throw new RuntimeException("图片验证已过期请重试");
        }
        String string = ajaxResult.getResultObj().toString();
        if(!imageCode.toLowerCase().equals(string.toLowerCase())){
            throw new RuntimeException("图片验证错误请重试");
        }
        String sms = null;
        //获得一个有效的Key存到redis
        long now = new Date().getTime();
        String phoneKey= RegstContant.PHONE_REGIST_PRE+mobile;
        //3.判断上一次是否有一个未使用的有效验证码
        AjaxResult lastReuslt = redisFegin.get(phoneKey);
        PhoneSendVo phoneSendVo = null;
        if(lastReuslt.getResultObj()!=null && lastReuslt.isSuccess()){
            //4.如果有,并且过了重发时间(两次发送时间大于60S)使用上一次有效验证码
            phoneSendVo = JSON.parseObject(lastReuslt.getResultObj().toString(), PhoneSendVo.class);
            if((phoneSendVo.getTime()-now)/1000>60){
                throw new RuntimeException("请不要在一分钟内再发短信");
            }
            sms = phoneSendVo.getSMS();
        }else {
            sms = StrUtils.getRandomString(6);
        }
        //5.如果没有,创建一个新的短信验证码保存到redis
        phoneSendVo =new PhoneSendVo(sms, now);
        //6.把短信验证码存储到Redis,格式如: SMS:18244229575={code:”1234” , sendTime: “mills”}
        //问题怎么存储时间
        AjaxResult setexResult = redisFegin.setex(phoneKey, 600, JSON.toJSONString(phoneSendVo));
        if (!setexResult.isSuccess()){
            throw new RuntimeException("手机验证码Redis保存错误");
        }//发短信
        System.out.println("你的短信为【"+sms+"】,请在10分钟之内校验");
        System.out.println("保存到数据库");
    }

    private void BasicVerify(String imageCode, String imageCodeKey, String mobile) {
        if(StringUtils.isEmpty(imageCode)){
            throw new RuntimeException("请输入图片验证码");
        }
        if(StringUtils.isEmpty(imageCodeKey)){
            throw new RuntimeException("请刷新页面,重新输入图片验证码");
        }
        if(StringUtils.isEmpty(mobile)){
            throw new RuntimeException("请输入手机号");
        }
    }
View Code

 

posted on 2020-09-22 09:03  哦哟这个怎么搞  阅读(1222)  评论(0编辑  收藏  举报