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

This commit is contained in:
疯狂的狮子li 2021-09-02 15:19:18 +08:00
parent 76710e453e
commit 8b2f7f0e64
7 changed files with 101 additions and 66 deletions

View File

@ -1,25 +1,22 @@
package com.ruoyi.web.controller.common; package com.ruoyi.web.controller.common;
import cn.hutool.captcha.AbstractCaptcha; 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.CodeGenerator;
import cn.hutool.captcha.generator.RandomGenerator;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache; 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.framework.config.properties.CaptchaProperties;
import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -32,16 +29,6 @@ import java.util.concurrent.TimeUnit;
@RestController @RestController
public class CaptchaController { public class CaptchaController {
// 圆圈干扰验证码
@Resource(name = "CircleCaptcha")
private CircleCaptcha circleCaptcha;
// 线段干扰的验证码
@Resource(name = "LineCaptcha")
private LineCaptcha lineCaptcha;
// 扭曲干扰验证码
@Resource(name = "ShearCaptcha")
private ShearCaptcha shearCaptcha;
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
@ -65,40 +52,15 @@ public class CaptchaController {
// 保存验证码信息 // 保存验证码信息
String uuid = IdUtil.simpleUUID(); String uuid = IdUtil.simpleUUID();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String code = null;
// 生成验证码 // 生成验证码
CodeGenerator codeGenerator; CaptchaType captchaType = captchaProperties.getType();
AbstractCaptcha captcha; boolean isMath = CaptchaType.MATH == captchaType;
switch (captchaProperties.getType()) { Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
case "math": CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
codeGenerator = new UnsignedMathGenerator(captchaProperties.getNumberLength()); AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
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("验证码类别异常");
}
captcha.setGenerator(codeGenerator); captcha.setGenerator(codeGenerator);
captcha.createCode(); captcha.createCode();
if ("math".equals(captchaProperties.getType())) { String code = isMath ? getCodeResult(captcha.getCode()) : captcha.getCode();
code = getCodeResult(captcha.getCode());
} else if ("char".equals(captchaProperties.getType())) {
code = captcha.getCode();
}
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
ajax.put("uuid", uuid); ajax.put("uuid", uuid);
ajax.put("img", captcha.getImageBase64()); 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()); int b = Convert.toInt(StringUtils.substring(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
switch (operator) { switch (operator) {
case '*': case '*':
return a * b + ""; return Convert.toStr(a * b);
case '+': case '+':
return a + b + ""; return Convert.toStr(a + b);
case '-': case '-':
return a - b + ""; return Convert.toStr(a - b);
default: default:
return ""; return StringUtils.EMPTY;
} }
} }

View File

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

View File

@ -1,4 +1,4 @@
package com.ruoyi.framework.captcha; package com.ruoyi.common.captcha;
import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.math.Calculator; import cn.hutool.core.math.Calculator;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -1,10 +1,14 @@
package com.ruoyi.framework.config; package com.ruoyi.framework.config;
import java.awt.*; import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.captcha.*; import cn.hutool.captcha.LineCaptcha;
import cn.hutool.captcha.ShearCaptcha;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 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") @Lazy
public CircleCaptcha getCircleCaptcha() { @Bean
public CircleCaptcha circleCaptcha() {
CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(width, height); CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(width, height);
captcha.setBackground(background); captcha.setBackground(background);
captcha.setFont(font); captcha.setFont(font);
@ -33,8 +38,9 @@ public class CaptchaConfig {
/** /**
* 线段干扰的验证码 * 线段干扰的验证码
*/ */
@Bean(name = "LineCaptcha") @Lazy
public LineCaptcha getLineCaptcha() { @Bean
public LineCaptcha lineCaptcha() {
LineCaptcha captcha = CaptchaUtil.createLineCaptcha(width, height); LineCaptcha captcha = CaptchaUtil.createLineCaptcha(width, height);
captcha.setBackground(background); captcha.setBackground(background);
captcha.setFont(font); captcha.setFont(font);
@ -44,8 +50,9 @@ public class CaptchaConfig {
/** /**
* 扭曲干扰验证码 * 扭曲干扰验证码
*/ */
@Bean(name = "ShearCaptcha") @Lazy
public ShearCaptcha getShearCaptcha() { @Bean
public ShearCaptcha shearCaptcha() {
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(width, height); ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(width, height);
captcha.setBackground(background); captcha.setBackground(background);
captcha.setFont(font); captcha.setFont(font);

View File

@ -1,5 +1,7 @@
package com.ruoyi.framework.config.properties; package com.ruoyi.framework.config.properties;
import com.ruoyi.common.enums.CaptchaCategory;
import com.ruoyi.common.enums.CaptchaType;
import lombok.Data; import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -17,12 +19,12 @@ public class CaptchaProperties {
/** /**
* 验证码类型 * 验证码类型
*/ */
private String type; private CaptchaType type;
/** /**
* 验证码类别 * 验证码类别
*/ */
private String category; private CaptchaCategory category;
/** /**
* 数字验证码位数 * 数字验证码位数