Spring Boot 3 整合 Hutool 验证码实战

🚀 作者主页: 有来技术
🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 仓库主页: Gitee 💫 Github 💫 GitCode
💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

目录

  • 前言
  • 添加依赖
  • 验证码配置
    • application.yml
    • CaptchaProperties.java
    • CaptchaConfig.java
  • 验证码服务类
  • 验证码接口
  • 验证码测试
  • 结语
  • 开源项目

前言

在Web应用开发中,验证码是一种常用的安全措施,用于防止恶意软件自动提交表单。SpringBoot作为一种流行的Java企业级应用框架,提供了快速开发的能力。Hutool作为一个全面的Java工具类库,其中包含了方便的验证码生成工具。本文将指导你如何在SpringBoot 3项目中利用Hutool生成和验证验证码,从而提高应用的安全性和用户体验。

添加依赖

pom.xml中添加Hutool的依赖。Hutool是一个Java工具类库,它提供了简单易用的API,用于处理常见的编码任务,包括生成验证码。

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

验证码配置

application.yml

配置 Hutool 验证码类型、尺寸、字体和有效期

# 验证码配置
captcha:# 验证码类型 circle-圆圈干扰验证码|gif-Gif验证码|line-干扰线验证码|shear-扭曲干扰验证码type: circle# 验证码宽度width: 120# 验证码高度height: 40# 验证码干扰元素个数interfere-count: 2# 文本透明度(0.0-1.0)text-alpha: 0.8# 验证码字符配置code:# 验证码字符类型 math-算术|random-随机字符type: math# 验证码字符长度,type=算术时,表示运算位数(1:个位数运算 2:十位数运算);type=随机字符时,表示字符个数length: 1# 验证码字体font:# 字体名称 Dialog|DialogInput|Monospaced|Serif|SansSerifname: SansSerif# 字体样式 0-普通|1-粗体|2-斜体weight: 1# 字体大小size: 30# 验证码有效期(秒)expire-seconds: 120

CaptchaProperties.java

新建 CaptchaProperties.java 配置类将 application.yml 映射为 Java 对象

package com.youlai.system.plugin.captcha;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** 验证码配置** @author haoxr* @since 2023/11/24*/
@Component
@ConfigurationProperties(prefix = "captcha")
@Data
public class CaptchaProperties {/*** 验证码类型  circle-圆圈干扰验证码|gif-Gif验证码|line-干扰线验证码|shear-扭曲干扰验证码*/private String type;/*** 验证码图片宽度*/private int width;/*** 验证码图片高度*/private int height;/*** 干扰线数量*/private int interfereCount;/*** 文本透明度*/private Float textAlpha;/*** 验证码过期时间,单位:秒*/private Long expireSeconds;/*** 验证码字符配置*/private CodeProperties code;/*** 验证码字体*/private FontProperties font;/*** 验证码字符配置*/@Datapublic static class CodeProperties {/*** 验证码字符类型 math-算术|random-随机字符串*/private String type;/*** 验证码字符长度,type=算术时,表示运算位数(1:个位数 2:十位数);type=随机字符时,表示字符个数*/private int length;}/*** 验证码字体配置*/@Datapublic static class FontProperties {/*** 字体名称*/private String name;/*** 字体样式  0-普通|1-粗体|2-斜体*/private int weight;/*** 字体大小*/private int size;}
}

CaptchaConfig.java

新建自动装配配置类 CaptchaConfig.java,用于注入验证码生成器CodeGenerator 和验证码字体Font`,保证全局唯一示例。

package com.youlai.system.plugin.captcha;import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.captcha.generator.RandomGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.awt.*;/*** 验证码自动装配配置** @author haoxr* @since 2023/11/24*/
@Configuration
public class CaptchaConfig {@Autowiredprivate CaptchaProperties captchaProperties;/*** 验证码文字生成器** @return CodeGenerator*/@Beanpublic CodeGenerator codeGenerator() {String codeType = captchaProperties.getCode().getType();int codeLength = captchaProperties.getCode().getLength();if ("math".equalsIgnoreCase(codeType)) {return new MathGenerator(codeLength);} else if ("random".equalsIgnoreCase(codeType)) {return new RandomGenerator(codeLength);} else {throw new IllegalArgumentException("Invalid captcha generator type: " + codeType);}}/*** 验证码字体*/@Beanpublic Font captchaFont() {String fontName = captchaProperties.getFont().getName();int fontSize = captchaProperties.getFont().getSize();int fontWight = captchaProperties.getFont().getWeight();return new Font(fontName, fontWight, fontSize);}}

验证码服务类

下面贴出部分关键代码,完整代码:youlaii-boot

package com.youlai.system.service.impl;// .../*** 认证服务实现类** @author haoxr* @since 2.4.0*/
@Service
@RequiredArgsConstructor
public class AuthServiceImpl implements AuthService {private final CodeGenerator codeGenerator;private final Font captchaFont;private final CaptchaProperties captchaProperties;/*** 获取验证码** @return 验证码*/@Overridepublic CaptchaResult getCaptcha() {String type = captchaProperties.getType();int width = captchaProperties.getWidth();int height = captchaProperties.getHeight();int interfereCount = captchaProperties.getInterfereCount();int codeLength = captchaProperties.getCode().getLength();AbstractCaptcha captcha;if ("circle".equalsIgnoreCase(type)) {captcha = CaptchaUtil.createCircleCaptcha(width, height, codeLength, interfereCount);} else if ("gif".equalsIgnoreCase(type)) {captcha = CaptchaUtil.createGifCaptcha(width, height, codeLength);} else if ("line".equalsIgnoreCase(type)) {captcha = CaptchaUtil.createLineCaptcha(width, height, codeLength, interfereCount);} else if ("shear".equalsIgnoreCase(type)) {captcha = CaptchaUtil.createShearCaptcha(width, height, codeLength, interfereCount);} else {throw new IllegalArgumentException("Invalid captcha type: " + type);}captcha.setGenerator(codeGenerator);captcha.setTextAlpha(captchaProperties.getTextAlpha());captcha.setFont(captchaFont);String captchaCode = captcha.getCode();String imageBase64Data = captcha.getImageBase64Data();// 验证码文本缓存至Redis,用于登录校验String captchaKey = IdUtil.fastSimpleUUID();redisTemplate.opsForValue().set(CacheConstants.CAPTCHA_CODE_PREFIX + captchaKey,captchaCode,captchaProperties.getExpireSeconds(), TimeUnit.SECONDS);return CaptchaResult.builder().captchaKey(captchaKey).captchaBase64(imageBase64Data).build();}}

验证码接口

下面贴出部分关键代码,完整代码:youlaii-boot

   @Operation(summary = "获取验证码")@GetMapping("/captcha")public Result<CaptchaResult> getCaptcha() {CaptchaResult captcha = authService.getCaptcha();return Result.success(captcha);}

验证码测试

f访问接口 http://ip:port/api/v1/auth/captcha 获取验证码如下图:
在这里插入图片描述

结语

通过本文的指南,你应该能够在SpringBoot 3应用中成功整合Hutool来处理验证码相关的需求。这种集成不仅加强了应用的安全性,而且通过为用户提供图形验证码,增强了整体的用户交互体验。

开源项目

  • SpringCloud + Vue3 微服务商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移动端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 单体权限管理系统
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

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

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

相关文章

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练&#xff0c;LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型&#xff0c;但它具备理解和生成人类语言的能力&#xff0c;非常厉害&#xff01;它可以革新各个行业&#xff0c;包括自然语言处理、机器翻译、…

【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 一般涉及到最小层数问题…

PyTorch自动梯度计算(注意点)

if params.grad is not None: params.grad.zero_() 我们实际的运算往往会涉及到若干个requires-grad为true的张量进行运算&#xff0c;在这种情况下&#xff0c;Pytorch会计算整个计算图上的损失的导数&#xff0c;并把这些结果累加到grad属性中。多次调用backward()会导致梯度…

京东体育用品销售数据分析与可视化系统

京东体育用品销售数据分析与可视化系统 前言数据爬取模块1. 数据爬取2. 数据处理3. 数据存储 数据可视化模块1. 数据查看2. 店铺商品数量排行3. 整体好评率4. 不同品牌市场占比5. 品牌差评率排名6. 品牌价格排名7. 品牌评论数量分布 创新点 前言 在体育用品行业&#xff0c;了…

[Verilog] Verilog 数据类型

主页&#xff1a; 元存储博客 文章目录 前言1. bit 类型2. reg 类型3 wire类型4 integer类型5 real类型6 parameter类型7 enum类型8 array 类型9 向量类型10 time 类型11 string 类型 前言 在 Verilog 中&#xff0c;有几种不同的数据类型可以用于声明和操作变量。 在 Verilo…

系列十、存储引擎

一、存储引擎 1.1、概述 大家可能没有听说过存储引擎&#xff0c;但是一定听过引擎这个词&#xff0c;引擎就是发动机&#xff0c;是一个机器的核心组件。 比如&#xff0c;对于舰载机、直升机、火箭来说&#xff0c;它们都有各自的引擎&#xff0c;引擎是它们最为核心的组件。…

攻防世界--easyphp

浅学一下吧~ 发开题目是这样的 最烦的就是代码审计&#xff0c;还是看得少 多审计两篇代码就好了&#xff08;还是因为自己会的不多&#xff09; <?php highlight_file(__FILE__);//将当前文件的源代码进行高亮显示 $key1 0;//将变量$key1的值初始化为0 $key2 0;//将变量…

第一个程序(STM32F103点灯)

点亮LED 看原理图确定控制LED的引脚看主芯片手册确定如何设置/控制引脚写程序 LED有很多种&#xff0c;像插脚的&#xff0c;贴片的。 它们长得完全不一样&#xff0c;因此我们在原理图中将它抽象出来。 嵌入式系统中&#xff0c;一个LED的电阻非常低&#xff0c;I U/R&…

12.5,12.15AVL树更新,定义,插入

定义平衡因子为右子树高度减去左子树高度 AVL树插入分为两步&#xff1a; 按照二叉搜索树的方式插入新节点调整平衡因子 对于平衡因子的调整&#xff0c;在插入之前&#xff0c;所有节点的平衡因子分为三种情况&#xff1a;0&#xff0c;1&#xff0c;-1插入后&#xff0c;新…

EasyExcel 简单导入

前边写过使用easyexcel进行简单、多sheet页的导出。今天周日利用空闲写一下对应简单的导入。 重点&#xff1a;springboot、easyExcel、桥接模式&#xff1b; 说明&#xff1a;本次使用实体类student&#xff1a;属性看前边章节内容&#xff1b; 1、公共导入service public …

ArkTS编译时遇到arkts-no-obj-literals-as-types错误【Bug已解决-鸿蒙】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2此Bug解决方案总结项目场景: 在开发鸿蒙项目过程中,遇到了arkts-no-obj-literals-as-types,总结了自己和网上人的解决方案,故写下这篇文章。 遇到问题: rkTS编译时遇到arkts-no-obj-literals-as-type…

【数据结构】(二叉树)计算结点|叶子结点|高度|第K层结点数

目录 概念&#xff1a; 特殊的二叉树 二叉树的性质 二叉树的存储结构 二叉树的创建 二叉树遍历 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 计算结点数 计算叶子结点数 计算树的高度&#xff08;深度&#xff09; 计算第K层结点数 概念&#xff1a; 一颗…

PVE系列-防火墙的免费安静之旅IPfire

Ventoy一款引导盘可以引导各种启动盘安装盘的工具https://www.ventoy.net/cn/index.html 在它的兼容iso的列表 中发现了Ipfirehttps://wiki.ipfire.org/ &#xff0c;本来用着openwrt也挺好&#xff0c;忍不住的虚拟机尝了尝鲜&#xff0c;发现的功能有2&#xff0c; 安全吧&a…

虚拟化之安全虚拟化

虚拟化首次引入是在Armv7-A架构中。那时&#xff0c;Hyp模式&#xff08;在AArch32中相当于EL2&#xff09;仅在非安全状态下可用。当Armv8.4-A引入时&#xff0c;添加了对安全状态下EL2的支持作为一个可选特性。 当处理器支持安全EL2时&#xff0c;需要使用SCR_EL3.EEL2位从E…

linux文件打包和压缩

7.2 文件打包和压缩 7.2.1 tar tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。 ​ tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 ​ tar命令是Unix/Linux系统中备给文件的…

NetSuite 智能商品推荐(Intelligent Recommendations)

本周在一个客户环境里&#xff0c;发现销售订单中有个Intelligent Recommendations的按钮。 本以为是客户新装的一个SuiteApp&#xff0c;仔细研究一下发现还不是。是个我们忽略的一个内建新功能。 Intelligent Recommendations&#xff0c;是2023.1版本推出的新功能。主要目的…

Qt 表格相关API

1.文本框 限制输入数据类型&#xff08;如仅英文&#xff09; QValidator* validator new QRegExpValidator(QRegExp("[a-zA-Z]"), lineText); // 创建正则表达式验证器lineText->setValidator(validator); // 将验证器设置给 QLineEdit QLineEdit&#xff1a;单…

(2023|ICLR,文本反演,LDM,伪词)一个词描述一张图像:使用文本反演个性化文本到图像的生成

An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion 公纵号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方…

Vue 2.x跟Vue 3.x有啥区别

大家好&#xff0c;我是咕噜-凯撒&#xff0c;我们都知道Vue 是一款比较流行的前端JavaScript 框架&#xff0c;在他演进的过程中出现了2个主要版本&#xff0c;Vue 2.x 和 Vue 3.x。这两个版本之间有很多的区别&#xff0c;下面我以自己的理解介绍一下他们之间的区别。 响应性…

开源的数据流技术,该选择Redpanda还是Apache Kafka?

本文将比较Apache Kafka和Redpanda两种开源的数据流技术&#xff0c;在云原生实时处理能力上的不同&#xff0c;以及如何在项目中做出选择。 目前&#xff0c;Apache Kafka不但成为了数据流处理领域事实上的标准&#xff0c;而且带动了同类产品的出现。Redpanda就是其中之一…