南南的文章-验证码还能这样生成?
生成 文章 验证码 这样
2023-06-13 09:15:32 时间
前言:
同事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直接将图片流给前端,只要和前端约定好即可。
总结:
这样简单的验证码前后的一个逻辑就完成了。如果你想自己去画一个验证码出来,也可以去研究一下里面的奥秘~
相关文章
- swagger生成接口文档
- IDEA 自动生成mapper
- 两个链表生成相加链表
- 011-CH32V307(WCH单片机)学习开发 - MounRiver Studi生成bin文件或者hex文件
- 「 【Typecho插件】MIP/AMP页面自动生成插件 」
- 不做文盲画家!谷歌魔改「文本编码器」:一个小操作让图像生成模型学会「拼写」
- 开源模型、单卡训练,带你了解爆火的文本指导音频生成技术AudioLDM
- 全球首发,国产开源「文本-视频生成」模型!免费在线体验,一键实现视频生成自由
- java生成文件的默认保存路径与System.getProperty(“user.dir”)详解编程语言
- 快速生成Linux公钥的方法(linux生成公钥)
- #新闻拍一拍# 大学生用 GPT-3 生成伪文章成功骗过众人
- Linux下字典生成神器(linux字典生成)
- GridView生成的HTML代码示例对比