From 34e7f20f247844ea7c588d9a947d4be71c5b2c52 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期五, 21 五月 2021 17:58:01 +0800
Subject: [PATCH] update 验证码生成更新为无符号整数计算
---
ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java | 85 ++++++++++++++++++++++++++++++++++++++++++
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java | 4 +-
2 files changed, 87 insertions(+), 2 deletions(-)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
index c01cc4e..28be0fe 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
@@ -5,7 +5,6 @@
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 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 @@
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());
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java
new file mode 100644
index 0000000..b4f8bfc
--- /dev/null
+++ b/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));
+ }
+}
--
Gitblit v1.9.3