文章目录
主要内容:
- 图片验证码,点击图片重新生成
- 后端生成验证码,手机短信发送
一.图片验证码
生成验证码之后是需要保存到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);
}