流程:获取系统配置信息(是否开启验证码开关),开启则生成验证码图片返回,保存验证码答案到redis,返回redis中key值的uuid以供后续验证码验证。
- 进入首页时向后台发送验证码获取请求。
- 后台执行getimage方法
- @GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
AjaxResult ajax = AjaxResult.success();
boolean captchaOnOff = configService.selectCaptchaOnOff() - 后台执行方法获取系统配置信息获取是否开启了验证码开关,后端数据库中captchaOnOff默认值为true代表验证码开关默认开启。
- @Override
public boolean selectCaptchaOnOff()
{
String captchaOnOff = selectConfigByKey("sys.account.captchaOnOff");
if (StringUtils.isEmpty(captchaOnOff))
{
return true;
}
return Convert.toBool(captchaOnOff);
} - 先去缓存中获取配置信息,缓存中有直接返回,如果没有则新建一个系统配置实体类,其中验证码开关默认值为true,即开启验证码开关。
- @Override
public String selectConfigByKey(String configKey)
{
String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey)));
if (StringUtils.isNotEmpty(configValue))
{
return configValue;
}
SysConfig config = new SysConfig();
config.setConfigKey(configKey);
SysConfig retConfig = configMapper.selectConfig(config);
if (StringUtils.isNotNull(retConfig))
{
redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue());
return retConfig.getConfigValue();
}
return StringUtils.EMPTY;
} - 后台获取到验证码开关后 CAPTCHA_CODE_KEY加随机uuid组成redis中验证码答案的key值,若依系统配置中验证码类型captchaType为math即生成数学类型的验证码,
- 使用producer生成器生成验证码,需要的依赖:
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
使用Producer类的createText()生成验证码,格式为1+2=@3,通过@截取字符串,前面的部分调用Producer.createImage()生成图片验证码,后面的code作为答案存入redis中。图片使用输出流返回前端,将uuid返回。前端认证时,将uuid传回前端供用户认证时携带进行验证码认证。
- // 保存验证码信息
String uuid = IdUtils.simpleUUID();
String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
String capStr = null, code = null;
BufferedImage image = null;
// 生成验证码
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);
}
redisCache.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;