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