瀏覽代碼

update 验证码生成更新为无符号整数计算

疯狂的狮子li 4 年之前
父節點
當前提交
db18050b86

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java

@@ -5,7 +5,6 @@ import cn.hutool.captcha.CircleCaptcha;
 import cn.hutool.captcha.LineCaptcha;
 import cn.hutool.captcha.ShearCaptcha;
 import cn.hutool.captcha.generator.CodeGenerator;
-import cn.hutool.captcha.generator.MathGenerator;
 import cn.hutool.captcha.generator.RandomGenerator;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.IdUtil;
@@ -13,6 +12,7 @@ import cn.hutool.core.util.StrUtil;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.framework.captcha.UnsignedMathGenerator;
 import com.ruoyi.framework.config.properties.CaptchaProperties;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -59,7 +59,7 @@ public class CaptchaController {
 		AbstractCaptcha captcha;
 		switch (captchaProperties.getType()) {
 			case "math":
-				codeGenerator = new MathGenerator(captchaProperties.getNumberLength());
+				codeGenerator = new UnsignedMathGenerator(captchaProperties.getNumberLength());
 				break;
 			case "char":
 				codeGenerator = new RandomGenerator(captchaProperties.getCharLength());

+ 85 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java

@@ -0,0 +1,85 @@
+package com.ruoyi.framework.captcha;
+
+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 cn.hutool.core.util.StrUtil;
+
+/**
+ * 无符号计算生成器
+ *
+ * @author Lion Li
+ */
+public class UnsignedMathGenerator implements CodeGenerator {
+
+	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 min = RandomUtil.randomInt(limit);
+		int max = RandomUtil.randomInt(min, limit);
+		String number1 = Integer.toString(max);
+		String number2 = Integer.toString(min);
+		number1 = StrUtil.padAfter(number1, this.numberLength, CharUtil.SPACE);
+		number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE);
+
+		return number1 + RandomUtil.randomChar(operators) + number2 + '=';
+	}
+
+	@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" + StrUtil.repeat('0', this.numberLength));
+	}
+}