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.hqwc.cn/news/282615.html

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

相关文章

Windows安装Elasticsearch并结合内网穿透实现公网远程访问

Windows安装Elasticsearch并结合内网穿透实现公网远程访问 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜…

Hard Fault定位利器——开源组件CmBacktrace

前言 记录学习过程STM32/GD32FreeRTOSCmBacktrace移植。在MCU的开发中&#xff0c;由于程序设计的疏忽或者没有考虑到的一些异常情况&#xff0c;非常容易触发Hard Fault&#xff0c;在开发前期阶段触发Hard Fault时&#xff0c;我们可以通过连接调试工具利用keil比较容易定位到…

liunx之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

OceanBase数据库初识

文章目录 说明分布式数据库发展发展历史OceanBase和传统数据库的对比总结 OceanBase数据库产品简介应用案例 OceanBase数据库产品OceanBase数据库内核OceanBase开发者中心&#xff08;ODC&#xff09;产品架构OMS核心功能简介 说明 本文仅供学习和交流学习内容参考官方的培训资…

电子元器件介绍——电容(二)

电子元器件 文章目录 电子元器件前言2.1 电容的基本知识2.2 电容的等效电路2.3 电容的分类2.4电容的特性参数2.5电容的作用旁路&#xff08;去耦&#xff09;高低通滤波 2.6 两端电容2.7电容的失效 总结 前言 这节我们介绍电容。 2.1 电容的基本知识 电容器是一种能储存电荷…

【华为】文档中命令行约定格式规范(命令行格式规范、命令行行为规范、命令行参数格式、命令行规范)

文章目录 命令行约定格式**粗体&#xff1a;命令行关键字***斜体&#xff1a;命令行参数*[ ]&#xff1a;可选配置{ x | y | ... } 和 [ x | y | ... ]&#xff1a;选项{ x | y | ... }* 和 [ x | y | ... ]*&#xff1a;多选项&<1-n>&#xff1a;重复参数#&#xff…

嵌入式开发中的总线与时钟

总线 AHB总线 AHB的全称是"Advanced High-performance Bus",中文翻译就是"高级高性能总线"。这是一种在计算机系统中用于连接不同硬件组件的总线架构,它可以帮助这些组件之间高效地传输数据和信息。这个总线架构通常用于处理速度较快且对性能要求较高的…

java内置的数据结构

Java语言提供了许多内置的数据结构&#xff0c;包括&#xff1a; 1. 数组&#xff08;Array&#xff09;&#xff1a;数组是最基本的数据结构之一&#xff0c;它是一个有序的元素集合&#xff0c;每个元素都有一个对应的索引。在Java中&#xff0c;数组可以通过声明和初始化来创…

gitee gihub上传步骤

上传 1. 到具体要上传的文件目录 2. 右击git Bash Here 初始化仓库&#xff1a;git init 3. 添加文件 添加所有文件 : git add . &#xff08;注意这里有个点&#xff09;添加具体文件&#xff1a; git add test.md 4. 添加到暂存区 git commit -m 暂存区 5. 将本地代…

《人工智能导论》知识思维导图梳理【第6章节】

文章目录 第六章 知识图谱1 知识图谱概述2 知识图谱相关概念3 知识图谱的逻辑结构4 知识图谱的数据存储5 知识图谱的构建过程6 例题 markdown内容的分享 第六章 知识图谱 1 知识图谱概述 2 知识图谱相关概念 3 知识图谱的逻辑结构 4 知识图谱的数据存储 5 知识图谱的构建过程 6…

【LangChain学习之旅】—(3) LangChain快速构建本地知识库的智能问答系统

【LangChain学习之旅】—&#xff08;3&#xff09; LangChain快速构建本地知识库的智能问答系统 项目及实现框架开发框架核心实现机制数据准备及加载加载文本文本的分割向量数据库存储文本的“嵌入”概念向量数据库概念 相关信息获取RetrievalQA生成回答并展示示例小结 Refere…

自然语言处理阅读第二弹

HuggingFace 镜像网站模型库 NLP中的自回归模型和自编码模型 自回归&#xff1a;根据上文内容预测下一个可能的单词&#xff0c;或者根据下文预测上一个可能的单词。只能利用上文或者下文的信息&#xff0c;不能同时利用上文和下文的信息。自编码&#xff1a;对输入的句子随…