hutool工具实践-验证码

news2025/1/22 9:25:57

简介  

验证码功能位于cn.hutool.captcha包中,核心接口为ICaptcha,此接口定义了以下方法:

  • createCode 创建验证码,实现类需同时生成随机验证码字符串和验证码图片
  • getCode 获取验证码的文字内容
  • verify 验证验证码是否正确,建议忽略大小写
  • write 将验证码图片写出到目标流中

其中write方法只有一个OutputStreamICaptcha实现类可以根据这个方法封装写出到文件等方法。

AbstractCaptcha为一个ICaptcha抽象实现类,此类实现了验证码文本生成、非大小写敏感的验证、写出到流和文件等方法,通过继承此抽象类只需实现createImage方法定义图形生成规则即可。

ps:国产的工具库,值得支持

官网地址:Hutool🍬一个功能丰富且易用的Java工具库,涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等功能。

依赖引入

<dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.17</version>
</dependency>

使用示例

线段干扰验证码

    @Test
    public void lineCaptchaTest() {
        //定义图形验证码的长和宽
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100);

        //图形验证码写出,可以写出到文件,也可以写出到流
        captcha.write("d:/line.png");

        //输出code
        Console.log(captcha.getCode());

        //验证图形验证码的有效性,返回boolean值
        captcha.verify("1234");
    }

生产的验证形如:

圆圈干扰验证码

    @Test
    public void circleCaptchaTest() {
        //定义图形验证码的长、宽、验证码字符数、干扰元素个数
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(800, 400);
        //CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);

        //图形验证码写出,可以写出到文件,也可以写出到流
        captcha.write("d:/circle.png");

        Console.log(captcha.getCode());

        //验证图形验证码的有效性,返回boolean值
        printVerify("1234",captcha);
    }

生成的验证码形如:

扭曲干扰验证码

    @Test
    public void circleCaptchaTest() {
        //定义图形验证码的长、宽、验证码字符数、干扰元素个数
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(800, 400);
        //CircleCaptcha captcha = new CircleCaptcha(200, 100, 4, 20);

        //图形验证码写出,可以写出到文件,也可以写出到流
        captcha.write("d:/circle.png");

        Console.log(captcha.getCode());

        //验证图形验证码的有效性,返回boolean值
        printVerify("1234",captcha);
    }

生成的验证码形如:

verify代码

private void printVerify(String verifyCode, AbstractCaptcha captcha) {
        Console.log("验证结果是:" + captcha.verify(verifyCode));
    }

说明

1  框架验证默认使用的生成器是:RandomGenerator(随机数生成器),可以指定运算生成器,甚至自定义验证码生成器(实现CodeGenerator接口即可)

2 生成的验证码是存储在内存中的,后续要做输入验证需要使用同一个ICaptcha验证(当然也可以把验证码存储在其他地方,比如redis,然后标记一下,后续验证只要能取到对应的验证做验证即可)

实践案例

        验证码的使用主要在登录和各种操作需要验证密码的场景下,以下是一个简单的登录验证码的使用

1  创建接口生产验证码图片

    @GetMapping("captCha")
    public R<CaptchaVo> captCha() {
        CaptchaVo captchaVo = new CaptchaVo();
        captchaVo.setImg(diyMath());
        return R.success(captchaVo);
    }

    public String diyMath() {
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 45, 1, 4);
        // 自定义验证码内容为四则运算方式
        captcha.setGenerator(new MathGenerator());
        // 重新生成code
        captcha.createCode();
        String code = captcha.getCode();
        Console.log("运算生成的验证码是:" + code);
        return captcha.getImageBase64();
    }
/**
 * 验证码信息
 */
@Data
public class CaptchaVo {

    private String uuid;

    /**
     * 验证码图片
     */
    private String img;

}

2 在html页面中通过<img src = "">标签渲染图片

function createCodeImg(domElement) {
    debugger;
    let uri = "/captCha"
    let request = new XMLHttpRequest();
    // 2、建立连接
    // true:请求为异步  false:同步
    request.open("GET", uri, false);
    request.send();
    let resSource = request.responseText;
    let response  = JSON.parse(request.responseText);

    // 设置img元素的src属性为创建的URL
    document.getElementById('loginImg').src = "data:image/gif;base64," + response.data.img;
}

这里通过get请求获取后端接口数据,在后端返回的图片信息时,返回的是图片的Base64数据信息,形如:

在前端直接通过该dom元素的src属性就可以渲染出来

为了保证在后续的登录验证时能校验验证码,后端回传了一个uuid到前端,作为绑定验证码的唯一凭据,验证码的数据是存储在redis中。在之后的登录验证时,前端将验证码关联的唯一凭据和验证码结果一起传给后端,后端通过唯一凭据查询redis,完成验证码的校验流程

如何计算结果

通过RandomGenerator生成的验证码无需计算,直接存储在redis中即可,如果是MathGenerator生成的验证码是需要计算结果的,如何获取计算结果呢?

hutool提供的工具:Calculator

    @Test
    public void mathStrCount() {
        String testCode = "12*13";
        double conversion = Calculator.conversion(testCode);
        Console.log(conversion);
    }

计算结果是:156.0

spring提供的工具:ExpressionParser

    @Test
    public void mathSpringCount() {
        String testCode = "12*13";
        ExpressionParser parser = new SpelExpressionParser();
        Expression exp = parser.parseExpression(testCode);
        String result = exp.getValue(String.class);
        Console.log(result);
    }

计算结果是:156

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

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

相关文章

【Python报错】已解决ModuleNotFoundError: No module named ‘xxx‘ in Jupyter Notebook

解决Python报错&#xff1a;ModuleNotFoundError: No module named ‘xxx’ in Jupyter Notebook 在使用Jupyter Notebook进行数据分析或科学计算时&#xff0c;我们经常需要导入各种Python模块。如果你遇到了ModuleNotFoundError: No module named xxx的错误&#xff0c;这通常…

校园外卖系统的技术架构与实现方案

随着校园生活的日益现代化&#xff0c;外卖需求在高校学生群体中迅速增长。为了满足这一需求&#xff0c;校园外卖系统应运而生。本文将详细探讨校园外卖系统的技术架构及其实现方案&#xff0c;帮助读者了解这一系统的核心技术与实现路径。 一、系统概述 校园外卖系统主要包…

一文读懂 Compose 支持 Accessibility 无障碍的原理

前言 众所周知&#xff0c;Compose 作为一种 UI 工具包&#xff0c;向开发者提供了实现 UI 的基本功能。但其实它还默默提供了很多其他能力&#xff0c;其中之一便是今天需要讨论的&#xff1a;Android 特色的 Accessibility 功能。 采用 Compose 搭建的界面&#xff0c;完美…

二分+模拟,CF1461D - Divide and Summarize

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1461D - Codeforces 二、解题报告 1、思路分析 我们发现每次分裂操作结果都是固定的 我们从初始序列分裂出两个确定的子序列&#xff0c;两个确定的子序列又分裂出4个确定的子序列 那么也就是说…

【Python】解决Python报错:ZeroDivisionError: division by zero

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 直接除零2.2 变量导致的间接除零 3. 解决方案3.1 检查除数3.2 使用异常处理 4. 预防措施4.1 数据验证4.2 编写防御性代码 结语 引言 在Python中&#xff0c;尝试将一个数字除以零时&#xff0c;会抛出ZeroDivisionErr…

【Rust】——面向对象设计模式的实现

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

C++第二十五弹---从零开始模拟STL中的list(下)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、函数补充 2、迭代器完善 3、const迭代器 总结 1、函数补充 拷贝构造 思路&#xff1a; 先构造一个头结点&#xff0c;然后将 lt 类中的元…

使用亮数据代理IP爬取PubMed文章链接和邮箱地址

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

2024上海初中生古诗文大会倒计时4个多月:单选题真题和独家解析

现在距离2024年初中生古诗文大会还有4个多月时间&#xff0c;我们继续来看10道选择题真题和详细解析&#xff0c;以下题目截取自我独家制作的在线真题集&#xff0c;都是来自于历届真题&#xff0c;去重、合并后&#xff0c;每道题都有参考答案和解析。 为帮助孩子自测和练习&…

Html/HTML5常用标签的学习

课程目标 项目实战&#xff0c;肯定就需要静态网页。朝着做项目方式去学习静态网页。 01、编写第一个html工程结构化 cssjsimages/imgindex.html 归档存储和结构清晰就可以。 02、HTML标签分类 认知&#xff1a;标签为什么要分类&#xff0c;原因因为&#xff1a;分门别类…

【经验】Ubuntu上离线安装VsCode插件浏览Linux kernel源码

1、下载VsCode离线安装包 1.1 下载 下载地址:https://marketplace.visualstudio.com/vscode 本人安装的插件: C/C++ checkpatch Chinese clangd kconfig Makefile Tools Perl Perl Toolbox注意:C/C++插件要安装Linux 64版本 1.2 安装 将离线安装包拷贝到Ubuntu中,执…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

【CS.CN】优化HTTP传输:揭示Transfer-Encoding: chunked的奥秘与应用

文章目录 0 序言0.1 由来0.2 使用场景 1 Transfer-Encoding: chunked的机制2 语法 && 通过设置Transfer-Encoding: chunked优化性能3 总结References 0 序言 0.1 由来 Transfer-Encoding头部字段在HTTP/1.1中被引入&#xff0c;用于指示数据传输过程中使用的编码方式…

赚钱而已,你又不是宠物,干嘛让所有人都喜欢你?

* 大家好&#xff0c;我是前端队长。前端程序员&#xff0c;2023年开始玩副业。做过AI绘画&#xff0c;公众号 AI 爆文&#xff0c;AI代写项目&#xff0c;累计变现五位数。 — 今天看到一句话说的真好&#xff1a; 太多人总想让别人喜欢自己了。有什么用&#xff0c;你又不是宠…

C++的线性回归模型

线性回归模型是数理统计中的一种回归分析方法&#xff0c;其核心思想是通过建立一个线性方程来描述因变量与自变量之间的关系。这种关系可以表示为y wx e&#xff0c;其中y是因变量&#xff0c;x是自变量&#xff0c;w是回归系数向量&#xff0c;e是误差项&#xff0c;服从均…

【TB作品】MSP430F5529 单片机,简单电子琴

使用MSP430制作一个简单电子琴 作品功能 这个项目基于MSP430单片机&#xff0c;实现了一个简单的电子琴。通过按键输入&#xff0c;电子琴可以发出对应的音符声音。具体功能包括&#xff1a; 按下按键时发出对应音符的声音。松开按键时停止发声。支持C调低音、中音和高音。 …

抖抖分析师和抖音分析有什么区别?

"抖抖分析师"和"抖音分析"虽然都与抖音这个平台有关&#xff0c;但是二者的含义有很大的区别。 首先&#xff0c;抖抖分析师通常指的是专门对抖音平台进行各种数据分析、用户行为研究、内容趋势预测等工作的人员。他们可能会洞察用户在抖音上的行为习惯&a…

OpenAI模型规范概览

这是OpenAI对外分享的模型规范文档&#xff08;Model Spec&#xff09;&#xff0c;它定义了OpenAI希望在API接口和ChatGPT&#xff08;含GPT系列产品&#xff09;中模型的行为方式&#xff0c;这也是OpenAI超级对齐团队奉行的行为准则&#xff0c;希望能对国内做RLHF的同学有帮…

Soildworks学习笔记(一)

1.如何添加M3,M4等螺丝孔&#xff1a; 有时候异形孔向导显示灰色是因为没有退出草图选项卡&#xff0c;选择异形孔向导就可以进行异形孔的设定和放置&#xff1a; solidwork放置螺丝孔以及显示螺纹的问题_.16-m3 solidwork-CSDN博客 2.如何修剪线条&#xff1a; 如何倒圆角或…

“薅羊毛”到被“割韭菜”,警惕网络副业陷井

本想“薅羊毛”却被“割韭菜”&#xff0c;这些现象在网络副业领域中尤为常见。许多人寻求在网络上开展副业以增加收入&#xff0c;但往往因为缺乏足够的警惕和了解&#xff0c;而陷入各种陷阱和风险中。 “薅羊毛”在副业领域通常指的是利用平台优惠、漏洞或规则&#xff0c;…