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("请输入手机号");
}
}