若依框架学习笔记——验证码篇

本篇文章记录自己学习若依框架业务开发逻辑的笔记

        当我在运行若依项目时,会首先进入到项目的登录界面,但是登陆界面的验证码验证功能在我以往的学习中并未接触过。因此,写下这篇文章记载学习下大佬的开发逻辑。

通过对ruoyi-ui前端模块的分析,我们能够发现,项目先通过url请求前端路径

http://localhost/dev-api/captchaImag

进行代理

 然后在vue.config.js中将路径重写,把dev-api重写为' ',然后映射给后端8080端口,解决跨域问题,因此后端得到的路径为http://localhost:8080/captchaImag,所以下一步,我们直接去ruoyi-admin模块下寻找captchaImag,看看这里的代码逻辑。

快捷寻找方法:

一、ctrl+shift+ F或者右键+在文件中查找

二、将captchaImag输入搜索款可直接定位至其映射下

于是我们找到了

@GetMapping("/captchaImage")

这个映射。

这个映射请求的是

public AjaxResult getCode(HttpServletResponse response) throws IOException

这个方法

 在这个方法中第一步,他通过三层嵌套创建了一个AjaxResult对象

AjaxResult ajax = AjaxResult.success();

因为他的最终一层嵌套返回的是AjaxResult对象

return new AjaxResult(HttpStatus.SUCCESS, msg, data);

这个对象实际就是后台给前端返回的一个模型。包含了状态,信息,数据三个信息。

后台给前端传的数据都装在ajax中。

 然后

boolean captchaEnabled = configService.selectCaptchaEnabled();

获取验证码开关传给catchaEnabled

/**
     * 获取验证码开关
     * 
     * @return true开启,false关闭
     */
    public boolean selectCaptchaEnabled();

 如果获取到验证码开关为关闭(即传给catchaEnabled参数为false)

则直接将ajax返回,该方法结束

if (!captchaEnabled)
        {
            return ajax;
        }

若开关为开启(即传给catchaEnabled参数为true)则继续执行后面代码

// 保存验证码信息
        String uuid = IdUtils.simpleUUID();
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;//验证关键
        String capStr = null, code = null;
        BufferedImage image = null;

uuid用来保存验证码答案,最后和用户输入的信息进行对比判断

verifyKey是验证的关键,他将一个常量

和uuid拼接在一起,保存在redis的一个key里面

在注释//生成验证码后面的这些代码便是验证码发挥作用的核心

// 生成验证码
        String captchaType = RuoYiConfig.getCaptchaType();
        if ("math".equals(captchaType))
        {
            String capText = captchaProducerMath.createText();
            capStr = capText.substring(0, capText.lastIndexOf("@"));
            code = capText.substring(capText.lastIndexOf("@") + 1);
            image = captchaProducerMath.createImage(capStr);
        }
        else if ("char".equals(captchaType))
        {
            capStr = code = captchaProducer.createText();
            image = captchaProducer.createImage(capStr);
        }

        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        // 转换流信息写出
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try
        {
            ImageIO.write(image, "jpg", os);
        }
        catch (IOException e)
        {
            return AjaxResult.error(e.getMessage());
        }

        ajax.put("uuid", uuid);
        ajax.put("img", Base64.encode(os.toByteArray()));
        return ajax;

我们通过断点进行分析

我们发现,这里的capText保存的是  6-2=?@4 

往后走

capStr保存capText被@分割后的前半部分内容,即 6-2=? 

再往下走

code保存 capText被@分割后的后半部分内容,即正确答案:4

将capText信息分割完毕并分别存储于capStr和code变量后继续往下走

redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);

这行代码将verifyKey和code的值存入redis ,后面的CAPTCHA_EXPIPATION和TimeUnit.MINUTES传给redis的数据分别是2和minutes,表示传给redis的verifyKey和code的值的有效期为2分钟。

我们接着往下走即可证明:

当我们往下走

 

即可看到redis中多了一个键

 

TTL:98代表验证码还有98秒过期

 然后后面代码将capStr的内容写成图片,然后将uuid和图片存入ajax中,然后返回ajax,最后反馈给前端。

cda备考学习学习笔记——基础知识(二)主要涉及了计算机科学与技术领域的基本概念和知识。 首先,它介绍了计算机网络的基础知识。网络是将多台计算机通过通信链路连接起来,使它们能够相互通信和共享资源的系统。笔记中详细介绍了网络的组成、拓扑结构和通信协议等重要内容。 其次,笔记还解释了计算机系统的基本组成。计算机系统由硬件和软件两部分组成,其中硬件包括中央处理器、存储器、输入输出设备等,而软件则分为系统软件和应用软件。笔记详细介绍了各种硬件和软件的功能和作用。 此外,笔记还对数据库管理系统进行了介绍。数据库管理系统是一种用于管理和组织数据的软件系统,它能够实现数据的存储、检索和更新等操作。笔记中详细介绍了数据库的概念、结构和操作等内容。 最后,笔记还包括了算法和数据结构的基础知识。算法是解决问题的一系列步骤和规则,而数据结构则是组织和存储数据的方式。笔记中介绍了常用的算法和数据结构,如排序算法、树和图等。 总之,通过学习CDA备考学习笔记中的基础知识(二),我们能够更好地理解计算机网络、计算机系统、数据库管理系统以及算法和数据结构等相关概念和知识。这些基础知识对于我们深入研究计算机科学与技术领域是非常重要的,也为我们日后的学习和工作奠定了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小西瓜呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值