mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-10-25 19:33:45 +08:00 
			
		
		
		
	update hutool 5.8.38 => 5.8.40 默认支持了验证码不生成负数
This commit is contained in:
		
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -26,7 +26,7 @@ | ||||
|         <satoken.version>1.44.0</satoken.version> | ||||
|         <mybatis-plus.version>3.5.12</mybatis-plus.version> | ||||
|         <p6spy.version>3.9.1</p6spy.version> | ||||
|         <hutool.version>5.8.38</hutool.version> | ||||
|         <hutool.version>5.8.40</hutool.version> | ||||
|         <spring-boot-admin.version>3.5.1</spring-boot-admin.version> | ||||
|         <redisson.version>3.51.0</redisson.version> | ||||
|         <lock4j.version>2.2.7</lock4j.version> | ||||
|   | ||||
| @@ -131,15 +131,18 @@ public class CaptchaController { | ||||
|         String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid; | ||||
|         // 生成验证码 | ||||
|         CaptchaType captchaType = captchaProperties.getType(); | ||||
|         boolean isMath = CaptchaType.MATH == captchaType; | ||||
|         Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength(); | ||||
|         CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length); | ||||
|         CodeGenerator codeGenerator; | ||||
|         if (CaptchaType.MATH == captchaType) { | ||||
|             codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), captchaProperties.getNumberLength(), false); | ||||
|         } else { | ||||
|             codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), captchaProperties.getCharLength()); | ||||
|         } | ||||
|         AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz()); | ||||
|         captcha.setGenerator(codeGenerator); | ||||
|         captcha.createCode(); | ||||
|         // 如果是数学验证码,使用SpEL表达式处理验证码结果 | ||||
|         String code = captcha.getCode(); | ||||
|         if (isMath) { | ||||
|         if (CaptchaType.MATH == captchaType) { | ||||
|             ExpressionParser parser = new SpelExpressionParser(); | ||||
|             Expression exp = parser.parseExpression(StringUtils.remove(code, "=")); | ||||
|             code = exp.getValue(String.class); | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| package org.dromara.common.web.enums; | ||||
|  | ||||
| import cn.hutool.captcha.generator.CodeGenerator; | ||||
| import cn.hutool.captcha.generator.MathGenerator; | ||||
| import cn.hutool.captcha.generator.RandomGenerator; | ||||
| import org.dromara.common.web.utils.UnsignedMathGenerator; | ||||
| import lombok.AllArgsConstructor; | ||||
| import lombok.Getter; | ||||
|  | ||||
| @@ -18,7 +18,7 @@ public enum CaptchaType { | ||||
|     /** | ||||
|      * 数字 | ||||
|      */ | ||||
|     MATH(UnsignedMathGenerator.class), | ||||
|     MATH(MathGenerator.class), | ||||
|  | ||||
|     /** | ||||
|      * 字符 | ||||
|   | ||||
| @@ -1,88 +0,0 @@ | ||||
| package org.dromara.common.web.utils; | ||||
|  | ||||
| import cn.hutool.captcha.generator.CodeGenerator; | ||||
| import cn.hutool.core.math.Calculator; | ||||
| import cn.hutool.core.util.CharUtil; | ||||
| import cn.hutool.core.util.RandomUtil; | ||||
| import org.dromara.common.core.utils.StringUtils; | ||||
|  | ||||
| import java.io.Serial; | ||||
|  | ||||
| /** | ||||
|  * 无符号计算生成器 | ||||
|  * | ||||
|  * @author Lion Li | ||||
|  */ | ||||
| public class UnsignedMathGenerator implements CodeGenerator { | ||||
|  | ||||
|     @Serial | ||||
|     private static final long serialVersionUID = -5514819971774091076L; | ||||
|  | ||||
|     private static final String OPERATORS = "+-*"; | ||||
|  | ||||
|     /** | ||||
|      * 参与计算数字最大长度 | ||||
|      */ | ||||
|     private final int numberLength; | ||||
|  | ||||
|     /** | ||||
|      * 构造 | ||||
|      */ | ||||
|     public UnsignedMathGenerator() { | ||||
|         this(2); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 构造 | ||||
|      * | ||||
|      * @param numberLength 参与计算最大数字位数 | ||||
|      */ | ||||
|     public UnsignedMathGenerator(int numberLength) { | ||||
|         this.numberLength = numberLength; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String generate() { | ||||
|         final int limit = getLimit(); | ||||
|         int a = RandomUtil.randomInt(limit); | ||||
|         int b = RandomUtil.randomInt(limit); | ||||
|         String max = Integer.toString(Math.max(a,b)); | ||||
|         String min = Integer.toString(Math.min(a,b)); | ||||
|         max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); | ||||
|         min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); | ||||
|  | ||||
|         return max + RandomUtil.randomChar(OPERATORS) + min + '='; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean verify(String code, String userInputCode) { | ||||
|         int result; | ||||
|         try { | ||||
|             result = Integer.parseInt(userInputCode); | ||||
|         } catch (NumberFormatException e) { | ||||
|             // 用户输入非数字 | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         final int calculateResult = (int) Calculator.conversion(code); | ||||
|         return result == calculateResult; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 获取验证码长度 | ||||
|      * | ||||
|      * @return 验证码长度 | ||||
|      */ | ||||
|     public int getLength() { | ||||
|         return this.numberLength * 2 + 2; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据长度获取参与计算数字最大值 | ||||
|      * | ||||
|      * @return 最大值 | ||||
|      */ | ||||
|     private int getLimit() { | ||||
|         return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user