前言:
同事A:咱这个管理后台页面的验证码咋搞啊?小面
小面:这你都不会?还来上什么班?(狗头)
同事A:???(黑脸)
今天小面给大家介绍验证码的前后逻辑与生成。
正文:
我们先写一个验证码的接口
@GetMapping("/captchaImg") public AjaxResult captchaImg(HttpServletResponse response){ return captchaService.captchaImg(response); }
实现类:
@Override public AjaxResult captchaImg(HttpServletResponse response) { LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100); try { lineCaptcha.write(response.getOutputStream()); } catch (IOException e) { throw new RuntimeException(e); } String simpleUUID = IdUtil.simpleUUID(); redisCache.setCacheObject(CacheConstants.CAPTCHA_CODE_KEY+simpleUUID , lineCaptcha.getCode(), Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); AjaxResult ajaxResult = AjaxResult.success(); ajaxResult.put("uuid",simpleUUID); ajaxResult.put("base64", lineCaptcha.getImageBase64()); return ajaxResult; }
这边我们使用的是HuTool的工具类,CaptchaUtil.createLineCaptcha(200, 100),去生成的验证码图片,参数是宽高的意思。
我们想要的验证码类型也是很多的,大小也可以去设置。
比如说我们常见的线段干扰,圆圈干扰,我们也可以自定义验证码(比如算数、纯字母的验证码、纯数字的验证码)。
生成验证码是很简单的,不过大家看看代码,我们在生成验证码之后,还去做了两步。
第一步去生成了一个uuid,第二步是把uuid和一个我们自己定义的一个字符串做成key,验证码作为value去存入缓存。然后封装进我们写的AjaxResult返回给前端。
这样设计是为什么呢?首先我们设计一个uuid就是为了防止key重复,以防验证码被覆盖。其次存入redis是为了,设置一个expire,也就是过期时间,这样子我们的验证码就可以过期啦~这就是为什么我们在登录网站的时候,停留的时间太久,就会出现验证码过期的情况。
同时我们在设计登录接口的时候,其中有一部就是要去缓存中拿到这个验证码,再去校验验证码。
//code是传进来的参数,也就是用户输入的验证码 String cacheObject = redisCache.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + uuid); if (!code.equals(cacheObject)){ throw new BaseException("login","10005",args,"验证码错误"); }
这也是为什么我们要把uuid也要传给前端,要不然我们就获取不到key啦。这里我们也可以做一个判断,cacheObject如果为空,那就返回一个验证码过期的提示给前端。
最后,我们可以把图片转化成base64给前端就可以啦,同时我们也可以使用outputStream直接将图片流给前端,只要和前端约定好即可。
总结:
这样简单的验证码前后的一个逻辑就完成了。如果你想自己去画一个验证码出来,也可以去研究一下里面的奥秘~