疯狂的狮子li
2021-09-02 8b2f7f0e647dca1716a0f792dabb7756c822a9ec
update 优化验证码配置 使用泛型 防止错误输入
已修改4个文件
已添加2个文件
已重命名1个文件
167 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaCategory.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/CaptchaType.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/CaptchaProperties.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
        }
    }
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
  # å­—符验证码长度
ruoyi-common/src/main/java/com/ruoyi/common/captcha/UnsignedMathGenerator.java
ÎļþÃû´Ó ruoyi-framework/src/main/java/com/ruoyi/framework/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;
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;
}
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;
}
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);
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;
    /**
     * æ•°å­—验证码位数