• 前后端分离生成手机验证码


    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
  • 相关阅读:
    高能天气——团队博客汇总
    高能天气——团队Scrum冲刺阶段-Day 1-领航
    20172303 2018-2019-1 《程序设计与数据结构》实验三报告
    高能天气——团队作业第二周
    20172303 2018-2019-1《程序设计与数据结构》深度优先遍历
    高能天气——团队作业第一周
    20172322 2018-2019-1《程序设计与数据结构》课程总结
    172322 2018-2019-1 《程序设计与数据结构》哈夫曼编码测试报告
    高能天气——团队Scrum冲刺阶段-Day 3
    172322 2018-2019-1 《程序设计与数据结构》实验三报告
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/13710115.html
Copyright © 2020-2023  润新知