mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +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