验证码功能

验证码:

1、首先用户进入登录页面前端触发调用验证码接口获取验证码 (/captchalmage),后端提供了具体的controller(CaptchaController)。

@RestController
public class CaptchaController {
/**
* 生成验证码
*/
@GetMapping("/captchaImage")
public AjaxResult getCode(HttpServletResponse response) throws IOException{

2、他这个验证码生成使用了谷歌开元工具包kaptcha,生成的数字验证码的代码,这个类我看不懂,只需要调api就行,kaptchakey生成数字或字符串不用的验证码,系统中使用配置文件的方式 进行配置,通过@Value注解的方式读取application.yml里的配置信息

3、那么这里读取的配置就是配置文件里配置的字符串math

@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转码后的图片

posted @   张栈  阅读(319)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示