Ver código fonte

update 优化验证码配置 使用泛型 防止错误输入

疯狂的狮子li 3 anos atrás
pai
commit
8b2f7f0e64

+ 14 - 52
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;
@@ -32,16 +29,6 @@ import java.util.concurrent.TimeUnit;
 @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 @@ public class CaptchaController {
 		// 保存验证码信息
 		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 @@ public class CaptchaController {
 		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;
 		}
 	}
 

+ 2 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -14,9 +14,9 @@ ruoyi:
 captcha:
   # 页面 <参数设置> 可开启关闭 验证码校验
   # 验证码类型 math 数组计算 char 字符验证
-  type: math
+  type: MATH
   # line 线段干扰 circle 圆圈干扰 shear 扭曲干扰
-  category: circle
+  category: CIRCLE
   # 数字验证码位数
   numberLength: 1
   # 字符验证码长度

+ 1 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/captcha/UnsignedMathGenerator.java → 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;

+ 35 - 0
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;
+}

+ 29 - 0
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;
+}

+ 16 - 9
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 @@ public class CaptchaConfig {
     /**
      * 圆圈干扰验证码
      */
-    @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 @@ public class CaptchaConfig {
     /**
      * 线段干扰的验证码
      */
-    @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 @@ public class CaptchaConfig {
     /**
      * 扭曲干扰验证码
      */
-    @Bean(name = "ShearCaptcha")
-    public ShearCaptcha getShearCaptcha() {
+    @Lazy
+    @Bean
+    public ShearCaptcha shearCaptcha() {
         ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(width, height);
         captcha.setBackground(background);
         captcha.setFont(font);

+ 4 - 2
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 @@ public class CaptchaProperties {
 	/**
 	 * 验证码类型
  	 */
-    private String type;
+    private CaptchaType type;
 
 	/**
 	 * 验证码类别
 	 */
-    private String category;
+    private CaptchaCategory category;
 
 	/**
 	 * 数字验证码位数