package com.xiaopeng.account.service.impl;
|
|
import com.google.code.kaptcha.Producer;
|
import com.xiaopeng.account.config.properties.CaptchaProperties;
|
import com.xiaopeng.account.service.IValidateCodeService;
|
import com.xiaopeng.common.core.constant.CacheConstants;
|
import com.xiaopeng.common.core.constant.Constants;
|
import com.xiaopeng.common.core.exception.CaptchaException;
|
import com.xiaopeng.common.core.utils.sign.Base64;
|
import com.xiaopeng.common.core.utils.uuid.IdUtils;
|
import com.xiaopeng.common.core.web.domain.AjaxResult;
|
import com.xiaopeng.common.redis.service.RedisService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
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.util.concurrent.TimeUnit;
|
|
/**
|
* 验证码实现处理
|
*
|
* @author ruoyi
|
*/
|
@Service
|
public class ValidateCodeServiceImpl implements IValidateCodeService {
|
|
@Resource(name = "captchaProducer")
|
private Producer captchaProducer;
|
|
@Resource(name = "captchaProducerMath")
|
private Producer captchaProducerMath;
|
|
@Autowired
|
private RedisService redisService;
|
|
@Autowired
|
private CaptchaProperties captchaProperties;
|
|
@Override
|
public AjaxResult createCaptcha() throws IOException, CaptchaException {
|
AjaxResult ajax = AjaxResult.success();
|
boolean captchaEnabled = Boolean.TRUE.equals(captchaProperties.getEnabled());
|
ajax.put("captchaEnabled", captchaEnabled);
|
if (!captchaEnabled) {
|
return ajax;
|
}
|
|
String uuid = IdUtils.simpleUUID();
|
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
|
|
String capStr = null;
|
String 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 {
|
capStr = captchaProducer.createText();
|
code = capStr;
|
image = captchaProducer.createImage(capStr);
|
}
|
|
redisService.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("img", Base64.encode(os.toByteArray()));
|
return ajax;
|
}
|
}
|