验证码功能
验证码:
1、首先用户进入登录页面前端触发调用验证码接口获取验证码 (/captchalmage),后端提供了具体的controller(CaptchaController)。
@RestController public class CaptchaController { /** * 生成验证码 */ @GetMapping("/captchaImage") public AjaxResult getCode(HttpServletResponse response) throws IOException{
@Value("${huike.captchaType}") private String captchaType;
4、这里初始化了一堆保存验证码信息的辅助变量,等用到 的时候再来研究
@GetMapping("/captchaImage") public AjaxResult getCode(HttpServletResponse response) throws IOException{ // 保存验证码信息 String uuid = IdUtils.simpleUUID(); String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String capStr = null, code = null; BufferedImage image = null;
5、这个if有两部分参数变化方向,此时肯定会走第一部分,因为配置文件里传来的是math,
6、此刻captchaProducerMath是什么和substing为什么要截取字符串的问题可以根据debug断点来看出来
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); }
6.1、用户进入登录页面前端刷新重新获取验证码,可以看到进入断点,可以看到capText的内容是7-5=?@2
6.2、按照@来截取字符串 capStr是7-5=?那么code的内容是2
6.3总结:code是计算结果capStr是公式
这个过程具体是怎么生成的我们不需要管,都是string capText = captchaProducerMath.createText();替我们生成好的
而captchaProducerMath是调用了Google的kaotcha的工具包生成的,反正我是看不懂,通过截取字符串的形式截取出验证码的结果code和验证码的公式capStr。不过我们返回给前端的不是一个具体的公式,而是
一个图片,这个还需要调用captchaProducerMath的createlmage方法将公式传入,工具包会给我们生成一个图片,通过BufferedImage(这个对象的作用是吧图片存到加载到内存中)来接收,将其生成 具体的图片后保存在内存中。
现在后端生成了验证码的结果,内存中也存储了图片,后续将图片返回给前端。
在登录的时候也要对比验证码结果,还有验证码超时时间
7、这里是往redis里存了一堆东西
这里verifyKey就是redis的key,code在redis中是value ,存的是验证码的值
String uuid = IdUtils.simpleUUID(); 这就说明这是一个简易的id生成工具类,然后定义了一个verifyKey是一个常量+刚刚生成的id组合而来 然后作为一个redis的key存入到redis中 存储redis的时候还设置了一个redis的超时时间 这样我们就往redis里存了验证码的结果,过期时间是2分钟
7.1、
===================================================================================
构建了一个结果集AjaxResult对象返回 并往这个对象里设置了一些属性 uuid 和 img
在构建结果集的时候这里使用了Base64转码,os是输出流,将输出流里的信息进行base64位转码这是 ,这是一种文件的传输方式,后端用base64的方式进行转码,那么前端也可以用base64的方式转回来, 我们给前端传的是图片,前端转回来也是图片,然后将图片先通过工具构建出来在内存中,并将其通过base64进行转 码,在通过包装类返回给前端 ,将我们一开始生成的一个id也封装进去了。大概的关于验证码生成这部分的逻辑就 已经全部讲完了。
总结:1.前端调用接口
2.后端读取配置文件,基于配置文件里的信息生成验证码
3.生成了验证码以后,将验证码的结果保存在redis中,并设置超时时间2分钟,其中key为一个id,值为 验证码的值
4.封装结果集返回前端,返回我们生成的一个id,和base64转码后的图片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)