From 8b2f7f0e647dca1716a0f792dabb7756c822a9ec Mon Sep 17 00:00:00 2001
From: 疯狂的狮子li <15040126243@163.com>
Date: 星期四, 02 九月 2021 15:19:18 +0800
Subject: [PATCH] update 优化验证码配置 使用泛型 防止错误输入

---
 ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaType.java                         |   29 +++++++++
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java |    6 +
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java                |   25 +++++---
 ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaCategory.java                     |   35 +++++++++++
 ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java             |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java           |   66 ++++-----------------
 ruoyi-admin/src/main/resources/application.yml                                             |    4 
 7 files changed, 101 insertions(+), 66 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 210ccee..f4e97c8 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
@@ -1,25 +1,22 @@
 package com.ruoyi.web.controller.common;
 
 import cn.hutool.captcha.AbstractCaptcha;
-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.RandomGenerator;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.IdUtil;
-import com.ruoyi.common.utils.StringUtils;
 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.common.enums.CaptchaType;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.reflect.ReflectUtils;
+import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.framework.config.properties.CaptchaProperties;
 import com.ruoyi.system.service.ISysConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.annotation.Resource;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -31,16 +28,6 @@
  */
 @RestController
 public class CaptchaController {
-
-	// 鍦嗗湀骞叉壈楠岃瘉鐮�
-	@Resource(name = "CircleCaptcha")
-	private CircleCaptcha circleCaptcha;
-	// 绾挎骞叉壈鐨勯獙璇佺爜
-	@Resource(name = "LineCaptcha")
-	private LineCaptcha lineCaptcha;
-	// 鎵洸骞叉壈楠岃瘉鐮�
-	@Resource(name = "ShearCaptcha")
-	private ShearCaptcha shearCaptcha;
 
 	@Autowired
 	private RedisCache redisCache;
@@ -65,40 +52,15 @@
 		// 淇濆瓨楠岃瘉鐮佷俊鎭�
 		String uuid = IdUtil.simpleUUID();
 		String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
-		String code = null;
 		// 鐢熸垚楠岃瘉鐮�
-		CodeGenerator codeGenerator;
-		AbstractCaptcha captcha;
-		switch (captchaProperties.getType()) {
-			case "math":
-				codeGenerator = new UnsignedMathGenerator(captchaProperties.getNumberLength());
-				break;
-			case "char":
-				codeGenerator = new RandomGenerator(captchaProperties.getCharLength());
-				break;
-			default:
-				throw new IllegalArgumentException("楠岃瘉鐮佺被鍨嬪紓甯�");
-		}
-		switch (captchaProperties.getCategory()) {
-			case "line":
-				captcha = lineCaptcha;
-				break;
-			case "circle":
-				captcha = circleCaptcha;
-				break;
-			case "shear":
-				captcha = shearCaptcha;
-				break;
-			default:
-				throw new IllegalArgumentException("楠岃瘉鐮佺被鍒紓甯�");
-		}
+		CaptchaType captchaType = captchaProperties.getType();
+		boolean isMath = CaptchaType.MATH == captchaType;
+		Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
+		CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
+		AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
 		captcha.setGenerator(codeGenerator);
 		captcha.createCode();
-		if ("math".equals(captchaProperties.getType())) {
-			code = getCodeResult(captcha.getCode());
-		} else if ("char".equals(captchaProperties.getType())) {
-			code = captcha.getCode();
-		}
+		String code = isMath ? getCodeResult(captcha.getCode()) : captcha.getCode();
 		redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
 		ajax.put("uuid", uuid);
 		ajax.put("img", captcha.getImageBase64());
@@ -112,13 +74,13 @@
 		int b = Convert.toInt(StringUtils.substring(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
 		switch (operator) {
 			case '*':
-				return a * b + "";
+				return Convert.toStr(a * b);
 			case '+':
-				return a + b + "";
+				return Convert.toStr(a + b);
 			case '-':
-				return a - b + "";
+				return Convert.toStr(a - b);
 			default:
-				return "";
+				return StringUtils.EMPTY;
 		}
 	}
 
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 000878f..6363e47 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -14,9 +14,9 @@
 captcha:
   # 椤甸潰 <鍙傛暟璁剧疆> 鍙紑鍚叧闂� 楠岃瘉鐮佹牎楠�
   # 楠岃瘉鐮佺被鍨� math 鏁扮粍璁$畻 char 瀛楃楠岃瘉
-  type: math
+  type: MATH
   # line 绾挎骞叉壈 circle 鍦嗗湀骞叉壈 shear 鎵洸骞叉壈
-  category: circle
+  category: CIRCLE
   # 鏁板瓧楠岃瘉鐮佷綅鏁�
   numberLength: 1
   # 瀛楃楠岃瘉鐮侀暱搴�
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java b/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java
similarity index 97%
rename from ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java
rename to ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java
index f35afdf..9c0f26f 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java
@@ -1,4 +1,4 @@
-package com.ruoyi.framework.captcha;
+package com.ruoyi.common.captcha;
 
 import cn.hutool.captcha.generator.CodeGenerator;
 import cn.hutool.core.math.Calculator;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaCategory.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaCategory.java
new file mode 100644
index 0000000..35d3ea3
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaCategory.java
@@ -0,0 +1,35 @@
+package com.ruoyi.common.enums;
+
+import cn.hutool.captcha.AbstractCaptcha;
+import cn.hutool.captcha.CircleCaptcha;
+import cn.hutool.captcha.LineCaptcha;
+import cn.hutool.captcha.ShearCaptcha;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 楠岃瘉鐮佺被鍒�
+ *
+ * @author Lion Li
+ */
+@Getter
+@AllArgsConstructor
+public enum CaptchaCategory {
+
+    /**
+     * 绾挎骞叉壈
+     */
+    LINE(LineCaptcha.class),
+
+    /**
+     * 鍦嗗湀骞叉壈
+     */
+    CIRCLE(CircleCaptcha.class),
+
+    /**
+     * 鎵洸骞叉壈
+     */
+    SHEAR(ShearCaptcha.class);
+
+    private final Class<? extends AbstractCaptcha> clazz;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaType.java
new file mode 100644
index 0000000..b1c50ca
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaType.java
@@ -0,0 +1,29 @@
+package com.ruoyi.common.enums;
+
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.captcha.generator.RandomGenerator;
+import com.ruoyi.common.captcha.UnsignedMathGenerator;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 楠岃瘉鐮佺被鍨�
+ *
+ * @author Lion Li
+ */
+@Getter
+@AllArgsConstructor
+public enum CaptchaType {
+
+    /**
+     * 鏁板瓧
+     */
+    MATH(UnsignedMathGenerator.class),
+
+    /**
+     * 瀛楃
+     */
+    CHAR(RandomGenerator.class);
+
+    private final Class<? extends CodeGenerator> clazz;
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
index 4cd9997..3d4bc9e 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
@@ -1,10 +1,14 @@
 package com.ruoyi.framework.config;
 
-import java.awt.*;
-
-import cn.hutool.captcha.*;
+import cn.hutool.captcha.CaptchaUtil;
+import cn.hutool.captcha.CircleCaptcha;
+import cn.hutool.captcha.LineCaptcha;
+import cn.hutool.captcha.ShearCaptcha;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+
+import java.awt.*;
 
 /**
  * 楠岃瘉鐮侀厤缃�
@@ -22,8 +26,9 @@
     /**
      * 鍦嗗湀骞叉壈楠岃瘉鐮�
      */
-    @Bean(name = "CircleCaptcha")
-    public CircleCaptcha getCircleCaptcha() {
+    @Lazy
+    @Bean
+    public CircleCaptcha circleCaptcha() {
         CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(width, height);
         captcha.setBackground(background);
         captcha.setFont(font);
@@ -33,8 +38,9 @@
     /**
      * 绾挎骞叉壈鐨勯獙璇佺爜
      */
-    @Bean(name = "LineCaptcha")
-    public LineCaptcha getLineCaptcha() {
+    @Lazy
+    @Bean
+    public LineCaptcha lineCaptcha() {
         LineCaptcha captcha = CaptchaUtil.createLineCaptcha(width, height);
         captcha.setBackground(background);
         captcha.setFont(font);
@@ -44,8 +50,9 @@
     /**
      * 鎵洸骞叉壈楠岃瘉鐮�
      */
-    @Bean(name = "ShearCaptcha")
-    public ShearCaptcha getShearCaptcha() {
+    @Lazy
+    @Bean
+    public ShearCaptcha shearCaptcha() {
         ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(width, height);
         captcha.setBackground(background);
         captcha.setFont(font);
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java
index cf9ad8b..354d8c3 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java
@@ -1,5 +1,7 @@
 package com.ruoyi.framework.config.properties;
 
+import com.ruoyi.common.enums.CaptchaCategory;
+import com.ruoyi.common.enums.CaptchaType;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
@@ -17,12 +19,12 @@
 	/**
 	 * 楠岃瘉鐮佺被鍨�
  	 */
-    private String type;
+    private CaptchaType type;
 
 	/**
 	 * 楠岃瘉鐮佺被鍒�
 	 */
-    private String category;
+    private CaptchaCategory category;
 
 	/**
 	 * 鏁板瓧楠岃瘉鐮佷綅鏁�

--
Gitblit v1.9.3