流程:獲取系統配置信息(是否開啟驗證碼開關),開啟則生成驗證碼圖片返回,保存驗證碼答案到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生成器生成驗證碼,需要的依賴:
-
// 保存驗證碼信息
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;