优化验证码模块相关代码,解决一个可能由于并发导致多发短信,或者多生成验证结果的情景。
This commit is contained in:
parent
af37386821
commit
956a6e465a
@ -32,14 +32,8 @@ public class SliderImageController {
|
||||
@GetMapping("/{verificationEnums}")
|
||||
@ApiOperation(value = "获取校验接口,一分钟同一个ip请求10次")
|
||||
public ResultMessage getSliderImage(@RequestHeader String uuid, @PathVariable VerificationEnums verificationEnums) {
|
||||
try {
|
||||
return ResultUtil.data(verificationService.createVerification(verificationEnums, uuid));
|
||||
} catch (ServiceException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
log.error("获取校验接口错误", e);
|
||||
throw new ServiceException(ResultCode.VERIFICATION_EXIST);
|
||||
}
|
||||
return ResultUtil.data(verificationService.createVerification(verificationEnums, uuid));
|
||||
|
||||
}
|
||||
|
||||
@LimitPoint(name = "slider_image", key = "verification_pre_check", limit = 600)
|
||||
|
@ -42,11 +42,8 @@ public class SmsController {
|
||||
@RequestHeader String uuid,
|
||||
@PathVariable String mobile,
|
||||
@PathVariable VerificationEnums verificationEnums) {
|
||||
if (verificationService.check(uuid, verificationEnums)) {
|
||||
smsUtil.sendSmsCode(mobile, verificationEnums, uuid);
|
||||
return ResultUtil.success(ResultCode.VERIFICATION_SEND_SUCCESS);
|
||||
} else {
|
||||
throw new ServiceException(ResultCode.VERIFICATION_SMS_EXPIRED_ERROR);
|
||||
}
|
||||
verificationService.check(uuid, verificationEnums);
|
||||
smsUtil.sendSmsCode(mobile, verificationEnums, uuid);
|
||||
return ResultUtil.success(ResultCode.VERIFICATION_SEND_SUCCESS);
|
||||
}
|
||||
}
|
||||
|
@ -89,7 +89,7 @@ public interface Cache<T> {
|
||||
*
|
||||
* @param key 缓存key
|
||||
*/
|
||||
void remove(Object key);
|
||||
Boolean remove(Object key);
|
||||
|
||||
/**
|
||||
* 删除
|
||||
|
@ -78,9 +78,9 @@ public class RedisCache implements Cache {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(Object key) {
|
||||
public Boolean remove(Object key) {
|
||||
|
||||
redisTemplate.delete(key);
|
||||
return redisTemplate.delete(key);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -426,8 +426,8 @@ public enum ResultCode {
|
||||
*/
|
||||
VERIFICATION_SEND_SUCCESS(80201, "短信验证码,发送成功"),
|
||||
VERIFICATION_ERROR(80202, "验证失败"),
|
||||
VERIFICATION_SMS_ERROR(80203, "短信验证码错误,请重新校验"),
|
||||
VERIFICATION_SMS_EXPIRED_ERROR(80204, "验证码已失效,请重新校验"),
|
||||
VERIFICATION_CODE_INVALID(80204, "验证码已失效,请重新校验"),
|
||||
VERIFICATION_SMS_CHECKED_ERROR(80210, "短信验证码错误,请重新校验"),
|
||||
|
||||
/**
|
||||
* 微信相关异常
|
||||
|
@ -20,7 +20,7 @@ public interface VerificationService {
|
||||
* @return 校验对象
|
||||
* @throws IOException 校验错误
|
||||
*/
|
||||
Map<String, Object> createVerification(VerificationEnums verificationEnums, String uuid) throws IOException;
|
||||
Map<String, Object> createVerification(VerificationEnums verificationEnums, String uuid);
|
||||
|
||||
/**
|
||||
* 预校验
|
||||
|
@ -51,7 +51,7 @@ public class VerificationServiceImpl implements VerificationService {
|
||||
* @return 验证码参数
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> createVerification(VerificationEnums verificationEnums, String uuid) throws IOException {
|
||||
public Map<String, Object> createVerification(VerificationEnums verificationEnums, String uuid) {
|
||||
|
||||
if (uuid == null) {
|
||||
throw new ServiceException(ResultCode.ILLEGAL_REQUEST_ERROR);
|
||||
@ -97,8 +97,7 @@ public class VerificationServiceImpl implements VerificationService {
|
||||
} catch (ServiceException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
log.error("创建校验错误", e);
|
||||
return null;
|
||||
throw new ServiceException(ResultCode.ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@ -136,16 +135,16 @@ public class VerificationServiceImpl implements VerificationService {
|
||||
public boolean preCheck(Integer xPos, String uuid, VerificationEnums verificationEnums) {
|
||||
Integer randomX = (Integer) cache.get(cacheKey(verificationEnums, uuid));
|
||||
if (randomX == null) {
|
||||
return false;
|
||||
throw new ServiceException(ResultCode.VERIFICATION_CODE_INVALID);
|
||||
}
|
||||
log.debug("{}{}", randomX, xPos);
|
||||
//验证结果
|
||||
if (Math.abs(randomX - xPos) < verificationCodeProperties.getFaultTolerant()) {
|
||||
//验证结果正确 && 删除标记成功
|
||||
if (Math.abs(randomX - xPos) < verificationCodeProperties.getFaultTolerant() && cache.remove(cacheResult(verificationEnums, uuid))) {
|
||||
//验证成功,则记录验证结果 验证有效时间与验证码创建有效时间一致
|
||||
cache.put(cacheResult(verificationEnums, uuid), true, verificationCodeProperties.getEffectiveTime());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
throw new ServiceException(ResultCode.VERIFICATION_ERROR);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -157,13 +156,11 @@ public class VerificationServiceImpl implements VerificationService {
|
||||
*/
|
||||
@Override
|
||||
public boolean check(String uuid, VerificationEnums verificationEnums) {
|
||||
Object object = cache.get(cacheResult(verificationEnums, uuid));
|
||||
if (object == null) {
|
||||
return false;
|
||||
} else {
|
||||
cache.remove(cacheResult(verificationEnums, uuid));
|
||||
//如果有校验标记,则返回校验结果
|
||||
if (cache.remove(cacheResult(verificationEnums, uuid))) {
|
||||
return true;
|
||||
}
|
||||
throw new ServiceException(ResultCode.VERIFICATION_CODE_INVALID);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user