1.创建一个ajax对象
首先我们先通过URL找到captchaImage然后搜索到代码区域。
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException
{
AjaxResult ajax = AjaxResult.success();//AjaxResult.success()前后端交互的所有有数据模型
boolean captchaOnOff = configService.selectCaptchaOnOff();
ajax.put("captchaOnOff", captchaOnOff); //captchaOnOff开关是存在数据库sys_config表里
if (!captchaOnOff)
{
return ajax;
}
先创建了一个ajax对象中的AjaxResule调用了success方法
public static AjaxResult success(String msg, Object data)
{
return new AjaxResult(HttpStatus.SUCCESS, msg, data);
}
success方法返回了AjaxResule对象(AjaxResule就是后端和前端交互的一个数据模型)
简单点说我们所有的数据交互都放在ajax对象里。
2.判断验证码是否开启
boolean captchaOnOff = configService.selectCaptchaOnOff();
ajax.put("captchaOnOff", captchaOnOff); //captchaOnOff开关是存在数据库sys_config表里
if (!captchaOnOff)
{
return ajax;
}
这一步就是判断验证码是否打开 , " captchaOnOff "开关是存在数据库sys_config表 这个默认开启。如果返回的是false就不会显示验证码我们这里可以在数据库里改成false
3.如果开启了验证以后保存验验证信息
// 保存验证码信息
String uuid = IdUtils.simpleUUID();//这里调用了一个一个已经写好的方法 作用是生成一个类似于密钥赋值给我们的uuid
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;//
String capStr = null, code = null;
BufferedImage image = null;
/**
* 验证码 redis key
*/
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
String verifykey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
这里就是把生成的uuid和我们常量拼起来 这里我直接用redis看到了最后生随机生成的密钥 captcha_codes:1040df10e7d34c078c5869aae4777608
4.生成验证码图片
调试结果
这里我打完断点可以看到这里生成我们前端验证码的图片,capStr和code里面分别存了公式和答案
redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
刚才的结果缓存到我们的redis里面(verifyKey:拼出来的那个值,code:密码,Constants.CAPTCHA_EXPIRATION:这是验证图片停留的时间)
5.javaIO转换图片
FastByteArrayOutputStream os = new FastByteArrayOutputStream();
try
{
ImageIO.write(image, "jpg", os);//把图片转成jpg格式
}
catch (IOException e)
{
return AjaxResult.error(e.getMessage());
}
ajax.put("uuid", uuid);//图片和ID一起放到UUid里面
ajax.put("img", Base64.encode(os.toByteArray()));
return ajax;//返回 ajaxa和前段形成一个闭环
}
}