若依框架讲解后端利用DefaultKaptcha生成验证码及校验

news2024/11/30 10:35:54
pom文件中引入DefaultKaptcha的依赖
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>2.3.2</version>
            </dependency>

Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如

  • 验证码的字体
  • 验证码字体的大小
  • 验证码字体的字体颜色
  • 验证码内容的范围(数字,字母,中文汉字!)
  • 验证码图片的大小,边框,边框粗细,边框颜色
  • 验证码的干扰线
  • 验证码的样式(鱼眼样式、3D、普通模糊、…)

CaptchaConfig类中配置验证码相关的参数(字符验证码)

在这里插入图片描述
若依的配置文件在这里
在这里插入图片描述
若依的验证码操作处理
在这里插入图片描述
在这里插入图片描述
提供了一个 getCode() 方法,用于生成验证码图片并将验证码信息保存到 Redis 缓存中。
在这里插入图片描述
首先判断是否启用了验证码功能,如果没有启用则直接返回一个 AjaxResult 对象,其中包含 captchaEnabled 字段(bool 类型),值为 false。
在这里插入图片描述
在这里插入图片描述
如果启用了验证码,则生成一个随机的 uuid 并将其作为验证码存储的 key,将验证码的值作为 value 存储到 Redis 缓存中,同时将验证码图片以 base64 格式返回给前端。

/**
 * 验证码操作处理
 * 
 * @author core
 */
@RestController
public class CaptchaController
{
    @Resource(name = "captchaProducer")
    private Producer captchaProducer; // 验证码生成器,用于生成字符验证码图片
    //自动装配 Spring 框架的相关注解(例如 @RestController、@Resource、@Autowired),这些注解在程序启动时会被解析,在需要时自动创建对象并注入依赖。
    @Resource(name = "captchaProducerMath")
    private Producer captchaProducerMath; // 验证码生成器,用于生成数学计算验证码图片

    @Autowired
    private RedisCache redisCache; // Redis 缓存服务,用于保存验证码信息
    
    @Autowired
    private ISysConfigService configService;   // 配置服务,用于获取是否启用验证码等信息
    /**
     * 生成验证码图片
     * @param response HTTP 响应对象
     * @throws IOException IO 异常
     */
    @GetMapping("/captchaImage")
    public AjaxResult getCode(HttpServletResponse response) throws IOException
    {
        AjaxResult ajax = AjaxResult.success(); // 创建 AjaxResult 对象,用于封装返回到前端的数据
        boolean captchaEnabled = configService.selectCaptchaEnabled();  // 获取是否启用验证码
        ajax.put("captchaEnabled", captchaEnabled);  // 将是否启用验证码的值保存到 AjaxResult 对象中,以返回到前端
        if (!captchaEnabled) // 如果未启用验证码,直接返回 AjaxResult 对象
        {
            return ajax;
        }

        // 生成验证码信息
        String uuid = IdUtils.simpleUUID();    // 随机生成 UUID 作为 Key
        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid; // 构造验证码 Key,用于在缓存中保存验证码信息

        String capStr = null, code = null; // 验证码字符串和验证码值
        BufferedImage image = null; // 验证码图片

        // 生成验证码图片和验证码值
        String captchaType = CoreConfig.getCaptchaType(); // 获取验证码类型,可选值有:"char" 和 "math"
        if ("math".equals(captchaType)) // 如果验证码类型为数学计算类型
        {
            String capText = captchaProducerMath.createText();  // 生成一个包含数学计算公式的验证码字符串
//            System.out.println(capText);
//            4-2=?@2
            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); // 将验证码信息存储到缓存中,验证码 Key 为 verifyKey,验证码值为 code
        // 转换验证码图片流,并以 base64 格式返回
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        try
        {
            ImageIO.write(image, "jpg", os);
        }
        catch (IOException e)
        {
            return AjaxResult.error(e.getMessage());
        }

        ajax.put("uuid", uuid); // 将 UUID 作为 'uuid' 键保存到 AjaxResult 中,以返回到前端
        ajax.put("img", Base64.encode(os.toByteArray()));// 将验证码图片的 base64 编码保存到 'img' 键中,以返回到前端
        return ajax;
    }
}

前端页面利用Img标签的src属性,根据Base64编码格式数据获取验证码图片显示。

    // 获取验证码方法
    getCode() {
      getCodeImg().then(res => {
          this.codeUrl = "data:image/gif;base64," + res.img;
          this.loginForm.uuid = res.uuid;
      });
    },
    <!-- 利用img标签,src属性根据Base64编码格式数据来获取验证码图。 -->
    <div class="login-code">
        <img :src="codeUrl" @click="getCode" class="login-code-img"/>
    </div>

校验验证码
在这里插入图片描述

 public void validateCaptcha(String username, String code, String uuid)
    {
        boolean captchaEnabled = configService.selectCaptchaEnabled();  // 获取是否启用验证码
        if (captchaEnabled) {   // 如果启用验证码
            String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + StringUtils.nvl(uuid, "");  // 构建缓存中验证码的 key
            String captcha = redisCache.getCacheObject(verifyKey);  // 从缓存中获取验证码信息
            redisCache.deleteObject(verifyKey);    // 从缓存中删除验证码信息
            if (captcha == null) {  // 如果验证码信息为空
                // 记录登录失败日志,并抛出 CaptchaExpireException 异常,表示验证码过期
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
                throw new CaptchaExpireException();
            }
            if (!code.equalsIgnoreCase(captcha)) { // 如果用户输入的验证码与缓存中的验证码不匹配
                // 记录登录失败日志,并抛出 CaptchaException 异常,表示验证码错误
                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
                throw new CaptchaException();
            }
        }
    }

以上就是若依框架生成验证码的功能以及校验过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个人 [Raft项目] 记一次内存泄漏排查

1 .发现过程 笔者在一步一步写Raft协议, 在可以跑了一天后,发现Leader节点的内存使用量缓慢上涨, 且手动执行GC后也没达到预期水平线 Leader节点内存情况 在对Java有深入了解的读者其实是可以理解内存使用量的产生 笔者的测试用例是: 启动四个节点,查看一天后的内存攀升, Le…

大专生,本科生,正在成为求职市场最尴尬的存在-我反对此言论,因为高成本,低科技,低利润产业将是中国未来五十年的主要特点

有很多视觉人机器视觉粉丝咨询我,我大专生可以学机器视觉开发吗? 我这里回答下:可以,你要自信点,下三年苦功夫,去学习,去专研,去找一个好点公司平台或者好点的培训机构。 学历不是评价一个人的唯一标准,但是它一直是社会对个人综合素质和知识储备的一种重要衡量标准…

卡尔曼滤波器-公式简单推导 | 原理分析 | 将卡尔曼滤波器在MatLab中简单实现

目录 1.状态转移2.协方差矩阵3.噪声协方差矩阵的传递4.观测矩阵5.状态更新6.噪声协方差矩阵的更新7.在MatLab中实现卡尔曼滤波器1.状态转移 卡尔曼滤波器又称为最佳线性滤波器。优点有实现简单、纯时域滤波器、不需要进行频域变换等。 假设有一辆汽车在路上行驶,用位置和速度…

Android+SQLite家庭食物储藏有效期提醒信息app源码

一个新的时代--移动互联网已经微笑着迎面而来。移动互联网与智能手机有着自身独特的优势&#xff0c;使得人们更方便的办公、娱乐&#xff0c;生活更加轻松。为了使人们对家庭里的食物能够更科学的管理&#xff0c;让人们随时随地能了解家庭所储藏食物的情况&#xff0c;及时让…

《程序员面试金典(第6版)》面试题 16.21. 交换和(哈希法,双指针,二分查找)

题目描述 给定两个整数数组&#xff0c;请交换一对数值&#xff08;每个数组中取一个数值&#xff09;&#xff0c;使得两个数组所有元素的和相等。题目入口 返回一个数组&#xff0c;第一个元素是第一个数组中要交换的元素&#xff0c;第二个元素是第二个数组中要交换的元素。…

vscode编译mysql-boost-5.7.37如何设置Cmake:configuration以及成功debug教程

前提&#xff1a;已经在服务器上编译安装好mysql5.7.37源码了&#xff0c;这里只是记录一下使用vscode远程连接服务器时如何成功debug&#xff0c;这篇与我发布的关于openGauss源码部署有双向链接关系&#xff0c;后续可方便查看。 1. 远程连接服务器进入连接界面 2. 设置Cmak…

《计算机网络—自顶向下方法》 第三章Wireshark实验:DNS协议分析

域名系统 DNS(Domain Name System) 是互联网使用的命名系统&#xff0c;用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS&#xff0c;但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字&#xff0c;并使…

达索的有限元分析软件Abaqus 2023版本下载与安装配置教程

目录 前言一、安装前准备二、Abaqus 安装总结 前言 Abaqus软件是一款广泛使用的有限元分析软件&#xff0c;可用于模拟各种工程应用程序&#xff0c;包括结构、流体力学、热传递、电磁和声学等。该软件提供了广泛的建模功能和多种求解器&#xff0c;可以帮助工程师预测材料和结…

lowcode-cms开源社区源码设计分享

开源背景 lowcode可视化社区 是我之前在设计研发 Dooring低代码 平台时开发的一个面向低代码内容分享的知识社区, 内容端采用 SSR 技术来渲染页面, 对 SEO 更加友好, 同时后端服务采用 Nodejs 来实现, 内容端和服务端同端, 也就是传说中的内容服务“同构”. 管理端采用前端最最…

【JUC】线程池有哪 4 种拒绝策略?

第一种拒绝策略是 AbortPolicy&#xff0c;这种拒绝策略在拒绝任务时&#xff0c;会直接抛出一个类型为 RejectedExecutionException 的 RuntimeException&#xff0c;让你感知到任务被拒绝了&#xff0c;于是你便可以根据业务逻辑选择重试或者放弃提交等策略。 第二种拒绝策略…

ChatGPT自动生成大厨菜谱

大厨菜谱 最近几年&#xff0c;越来越多年轻人也开始尝试自己在家做菜吃饭&#xff0c;而不仅仅是外出就餐或点外卖。有些人可以向长辈讨教做菜心得&#xff0c;有些人则开始尝试从互联网搜索学习菜谱。著名的"下厨房" App&#xff0c;就是针对这个需求应运而生的。…

华为许超:伙伴成功,才有华为企业业务成功

伙伴&#xff0c;可以说是今年ICT行业最为重要的词。各大厂商都在强调伙伴优先&#xff0c;发力伙伴体系构建。然而行业内更多是厂商单维度的信息释放&#xff0c;重视强调厂商面向伙伴的支持与赋能。这个过程中&#xff0c;似乎普遍缺少一个视角&#xff1a;那就是伙伴究竟需要…

美团一面:Spring Cloud 如何构建动态线程池?

美团一面&#xff1a;Spring Cloud 如何构建动态线程池&#xff1f; 说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如美团、极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a;…

最强linux抓包工具优劣势对比分析

ngrep 核心参数 参数名称参数介绍-q禁止在屏幕上输出匹配行-d定义网络接口&#xff0c;可以多次使用-W设置缓冲区大小&#xff0c;单位为MB&#xff0c;默认为2MB-n不解析ASCII数据-i设置网络接口&#xff0c;与-d参数相同-P将解析的协议名称作为输出的一部分-t显示时间戳-O输出…

Linux——线程1

背景知识 堆区细粒堆划分 我们在申请堆空间时&#xff0c;我们只是设置了空间大小&#xff0c;并未设置空间从哪里结束。 堆区里面的详细信息&#xff0c;如某段空间从哪开始&#xff0c;从哪结束&#xff0c;由vm_area_struct负责记录&#xff0c;每申请一段空间就增加一个vm_…

优于FCOS:在One-Stage和Anchor-Free目标检测中以最小的成本实现最小的错位(代码待开源)...

关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;ComputerVisionGzq 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 与基线FCOS&#xff08;一种单阶段和无锚目标象检测模型&#xff09;相比&#xff0c;新提出的模型…

STL-map容器

作为关联式容器的一种&#xff0c;map 容器存储的都是 pair 对象&#xff0c;也就是用 pair 类模板创建的键值对。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括 C基本数据类型&#xff08;int、double 等&#xff09;、使用结构体或类自定义的类型。…

IDEA中java文件出现黄色的J文件同时maven项目导入了依赖但是idea依赖加不进去的问题记录

IDEA导入项目后依赖jar包没有显示 报错提示尝试的解决方法检查对应的sdkmodule等配置信息开始尝试是不是版本问题&#xff0c;因为对上述maven报错进行查询&#xff0c;好像是因为版本太高导致的&#xff0c;开始下一个低版本进行尝试切换版本即可解决 总结后续出现的BUG 此次环…

Linux基本指令(三)

Linux基本指令 一.data指令1.基本使用2.时间戳 二.cal指令三.find指令四.grep指令五.zip/unzip指令六.tar指令&#xff08;打包/解包&#xff0c;不打开直接看内容&#xff09;七.bc指令八.uname指令九.几个重要热键十.关机 一.data指令 1.基本使用 下面不需要记住&#xff0c…

nodejs+Vue+elementui农家乐管理系统系统-住宿-美食-活动报名系统vue

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 目 录 管理员在还可以进行首页、个人中心、农家乐管理、美食信息管理、住宿信息管理、活动信息管理、用户管理、活动报名管理、客房预…