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