|
@@ -1,22 +1,22 @@
|
|
|
package com.ruoyi.gateway.service.impl;
|
|
package com.ruoyi.gateway.service.impl;
|
|
|
|
|
|
|
|
-import com.google.code.kaptcha.Producer;
|
|
|
|
|
|
|
+import cn.hutool.captcha.AbstractCaptcha;
|
|
|
|
|
+import cn.hutool.captcha.generator.CodeGenerator;
|
|
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
import com.ruoyi.common.core.constant.Constants;
|
|
import com.ruoyi.common.core.constant.Constants;
|
|
|
import com.ruoyi.common.core.exception.CaptchaException;
|
|
import com.ruoyi.common.core.exception.CaptchaException;
|
|
|
import com.ruoyi.common.core.utils.IdUtils;
|
|
import com.ruoyi.common.core.utils.IdUtils;
|
|
|
|
|
+import com.ruoyi.common.core.utils.SpringUtils;
|
|
|
import com.ruoyi.common.core.utils.StringUtils;
|
|
import com.ruoyi.common.core.utils.StringUtils;
|
|
|
-import com.ruoyi.common.core.utils.sign.Base64;
|
|
|
|
|
|
|
+import com.ruoyi.common.core.utils.reflect.ReflectUtils;
|
|
|
import com.ruoyi.common.core.web.domain.AjaxResult;
|
|
import com.ruoyi.common.core.web.domain.AjaxResult;
|
|
|
import com.ruoyi.common.redis.utils.RedisUtils;
|
|
import com.ruoyi.common.redis.utils.RedisUtils;
|
|
|
import com.ruoyi.gateway.config.properties.CaptchaProperties;
|
|
import com.ruoyi.gateway.config.properties.CaptchaProperties;
|
|
|
|
|
+import com.ruoyi.gateway.enums.CaptchaType;
|
|
|
import com.ruoyi.gateway.service.ValidateCodeService;
|
|
import com.ruoyi.gateway.service.ValidateCodeService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.util.FastByteArrayOutputStream;
|
|
|
|
|
|
|
|
|
|
-import javax.annotation.Resource;
|
|
|
|
|
-import javax.imageio.ImageIO;
|
|
|
|
|
-import java.awt.image.BufferedImage;
|
|
|
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
@@ -28,12 +28,6 @@ import java.util.concurrent.TimeUnit;
|
|
|
@Service
|
|
@Service
|
|
|
public class ValidateCodeServiceImpl implements ValidateCodeService
|
|
public class ValidateCodeServiceImpl implements ValidateCodeService
|
|
|
{
|
|
{
|
|
|
- @Resource(name = "captchaProducer")
|
|
|
|
|
- private Producer captchaProducer;
|
|
|
|
|
-
|
|
|
|
|
- @Resource(name = "captchaProducerMath")
|
|
|
|
|
- private Producer captchaProducerMath;
|
|
|
|
|
-
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private CaptchaProperties captchaProperties;
|
|
private CaptchaProperties captchaProperties;
|
|
|
|
|
|
|
@@ -54,42 +48,38 @@ public class ValidateCodeServiceImpl implements ValidateCodeService
|
|
|
// 保存验证码信息
|
|
// 保存验证码信息
|
|
|
String uuid = IdUtils.simpleUUID();
|
|
String uuid = IdUtils.simpleUUID();
|
|
|
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
|
|
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
|
|
|
-
|
|
|
|
|
- String capStr = null, code = null;
|
|
|
|
|
- BufferedImage image = null;
|
|
|
|
|
-
|
|
|
|
|
- String captchaType = captchaProperties.getType();
|
|
|
|
|
// 生成验证码
|
|
// 生成验证码
|
|
|
- if ("math".equals(captchaType))
|
|
|
|
|
- {
|
|
|
|
|
- String capText = captchaProducerMath.createText();
|
|
|
|
|
- capStr = capText.substring(0, capText.lastIndexOf("@"));
|
|
|
|
|
- code = capText.substring(capText.lastIndexOf("@") + 1);
|
|
|
|
|
- image = captchaProducerMath.createImage(capStr);
|
|
|
|
|
- }
|
|
|
|
|
- else if ("char".equals(captchaType))
|
|
|
|
|
- {
|
|
|
|
|
- capStr = code = captchaProducer.createText();
|
|
|
|
|
- image = captchaProducer.createImage(capStr);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ 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();
|
|
|
|
|
+ String code = isMath ? getCodeResult(captcha.getCode()) : captcha.getCode();
|
|
|
RedisUtils.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
|
|
RedisUtils.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
|
|
|
- // 转换流信息写出
|
|
|
|
|
- FastByteArrayOutputStream os = new FastByteArrayOutputStream();
|
|
|
|
|
- try
|
|
|
|
|
- {
|
|
|
|
|
- ImageIO.write(image, "jpg", os);
|
|
|
|
|
- }
|
|
|
|
|
- catch (IOException e)
|
|
|
|
|
- {
|
|
|
|
|
- return AjaxResult.error(e.getMessage());
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
ajax.put("uuid", uuid);
|
|
ajax.put("uuid", uuid);
|
|
|
- ajax.put("img", Base64.encode(os.toByteArray()));
|
|
|
|
|
|
|
+ ajax.put("img", captcha.getImageBase64());
|
|
|
return ajax;
|
|
return ajax;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private String getCodeResult(String capStr) {
|
|
|
|
|
+ int numberLength = captchaProperties.getNumberLength();
|
|
|
|
|
+ int a = Convert.toInt(StringUtils.substring(capStr, 0, numberLength).trim());
|
|
|
|
|
+ char operator = capStr.charAt(numberLength);
|
|
|
|
|
+ int b = Convert.toInt(StringUtils.substring(capStr, numberLength + 1, numberLength + 1 + numberLength).trim());
|
|
|
|
|
+ switch (operator) {
|
|
|
|
|
+ case '*':
|
|
|
|
|
+ return Convert.toStr(a * b);
|
|
|
|
|
+ case '+':
|
|
|
|
|
+ return Convert.toStr(a + b);
|
|
|
|
|
+ case '-':
|
|
|
|
|
+ return Convert.toStr(a - b);
|
|
|
|
|
+ default:
|
|
|
|
|
+ return StringUtils.EMPTY;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 校验验证码
|
|
* 校验验证码
|
|
|
*/
|
|
*/
|