1.问题怎么判断是否是同一个手机提交的验证码(保存到redis中通过手机号加一个参数就可以完成保存)
2.redis怎么存储并且判断在一段时间内不能够再发消息(key,contant)contan可以是"time + contant"的字符串,也可以是保存两个字段的对象
- 前台发起验证码发送申请(Ajax),并且按钮倒计时、禁用
- 后台接收到请求,判断图片验证码是否合法
- 判断上一次是否有一个未使用的有效验证码
- 如果有,并且过了重发时间(两次发送时间大于60S)使用上一次有效验证码
- 如果没有,创建一个新的短信验证码
- 把短信验证码存储到Redis,格式如: SMS:18244229575={code:”1234” , sendTime: “mills”}
- 调用第三方短信网关发送短信验证码
- 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("请输入手机号"); } }