优化验证码模块相关代码,解决一个可能由于并发导致多发短信,或者多生成验证结果的情景。
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
	 Chopper
						Chopper