利用hutool工具类实现验证码功能

hutool工具类实现验证码

  • 一.生成验证码
  • 二.校验验证码
  • 三.使用案例
    • 1.引入hutool工具类
    • 2.VerifyCodeResp接口响应体
    • 3.VerifyCodeController验证码工具类
    • 4.测试验证
    • 5.项目结构及源码下载

利用hutool工具类,可以很方便生成不同类型的验证码。这里简单记录下使用过程。

一.生成验证码

提供接口将生成的验证码存入session或redis,将验证码以图片格式或者base64编码串返回给调用端。

二.校验验证码

提供接口将收到调用端传过来的校验码,从session或redis取出验证码,两个验证码都全部转小写,进行无大小写区分匹配校验,返回true/flase 。

三.使用案例

1.引入hutool工具类

        <!-- hutool工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.12</version></dependency>

2.VerifyCodeResp接口响应体

@Data
public class VerifyCodeResp implements Serializable {/*** header头参数:Captcha-Key*/private String captchaKey;/*** 验证码图片*/private String captchaImg;
}

3.VerifyCodeController验证码工具类

/*** 验证码工具类*/
@RestController
public class VerifyCodeController {@ResourceRedisTemplate<String, String> redisTemplate;/*** 生成验证码** 方法一 ShearCaptcha* 图片格式* session存储* 接口需添加白名单放行** @param request HttpServletRequest*/@GetMapping("/verify")public void verify(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("image/jpeg");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);//定义图形验证码的长、宽、验证码字符数、干扰线宽度ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);//图形验证码写出,可以写出到文件,也可以写出到流shearCaptcha.write(response.getOutputStream());//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", shearCaptcha.getCode());}/*** 生成验证码** 方法二 LineCaptcha* 图片格式* session存储* 接口需添加白名单放行** @param request HttpServletRequest*/@GetMapping("/verifyTwo")public void verifyTwo(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("image/jpeg");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);//定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);//图形验证码写出,可以写出到文件,也可以写出到流ImageIO.write(lineCaptcha.getImage(), "JPEG", response.getOutputStream());//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());}/*** 方法三 ShearCaptcha* 图片的base64编码字符串* session存储* 接口需添加白名单放行** @param request HttpServletRequest* @return String*/@GetMapping("/getVerify")public String getVerify(HttpServletRequest request) {//定义图形验证码的长、宽、验证码字符数、干扰线宽度ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 4);//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", shearCaptcha.getCode());String base64String = "";try {base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();} catch (Exception e) {e.printStackTrace();}return base64String;}/*** 方法四 LineCaptcha* 图片的base64编码字符串* session存储* 接口需添加白名单放行** @param request HttpServletRequest* @return String*/@GetMapping("/getVerifyTwo")public String getVerifyTwo(HttpServletRequest request) {//定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);//获取验证码中的文字内容request.getSession().setAttribute("verifyCode", lineCaptcha.getCode());String base64String = "";try {//返回 base64ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(lineCaptcha.getImage(), "JPEG", bos);byte[] bytes = bos.toByteArray();Base64.Encoder encoder = Base64.getEncoder();base64String = "data:image/png;base64," + encoder.encodeToString(bytes);} catch (Exception e) {e.printStackTrace();}return base64String;}/*** 方法五 ShearCaptcha* 图片的base64编码字符串* redis存储* 接口需添加白名单放行** @return String*/@GetMapping("/getVerifyThree")public VerifyCodeResp getVerifyThree() {String captchaKey = UUID.randomUUID().toString();//定义图形验证码的长、宽、验证码字符数、干扰线宽度ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(150, 40, 5, 0);// 存入redis并设置过期时间为30分钟redisTemplate.opsForValue().set("captcha:" + captchaKey, shearCaptcha.getCode(), 30L, TimeUnit.MINUTES);String base64String = "";try {base64String = "data:image/png;base64," + shearCaptcha.getImageBase64();} catch (Exception e) {e.printStackTrace();}VerifyCodeResp verifyCodeResp = new VerifyCodeResp();verifyCodeResp.setCaptchaKey(captchaKey);verifyCodeResp.setCaptchaImg(base64String);return verifyCodeResp;}/*** 方法六 LineCaptcha* 图片的base64编码字符串* redis存储* 接口需添加白名单放行** @return String*/@GetMapping("/getVerifyFour")public VerifyCodeResp getVerifyFour() {String captchaKey = UUID.randomUUID().toString();//定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(150, 40, 5, 4);// 存入redis并设置过期时间为30分钟redisTemplate.opsForValue().set("captcha:" + captchaKey, lineCaptcha.getCode(), 30L, TimeUnit.MINUTES);String base64String = "";try {//返回 base64ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(lineCaptcha.getImage(), "JPEG", bos);byte[] bytes = bos.toByteArray();Base64.Encoder encoder = Base64.getEncoder();base64String = "data:image/png;base64," + encoder.encodeToString(bytes);} catch (Exception e) {e.printStackTrace();}VerifyCodeResp verifyCodeResp = new VerifyCodeResp();verifyCodeResp.setCaptchaKey(captchaKey);verifyCodeResp.setCaptchaImg(base64String);return verifyCodeResp;}
}

4.测试验证

如果测试验证码存入redis,则需要提前配置和启动redis。
在这里插入图片描述
在这里插入图片描述

5.项目结构及源码下载

在这里插入图片描述
下载地址 springboot-cacheable 欢迎star哦~

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

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

相关文章

基于OSATE环境的AADL项目——简单的项目构建与分析示例

一、背景 本文描述了一个非常简单的AADL项目的构建&#xff0c;以及一个示例项目的分析过程。本文主要记录了OSATE工具环境的一些基本操作&#xff0c;适用于刚刚了解OSATE之后&#xff0c;对于整个工具环境无从下手的小白。 因为基于OSATE环境的AADL项目的构建和分析的详细示…

LeetCode算法心得——美丽塔 I(HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;hashmap的灵活应用&#xff0c;然后边界的细节处理&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .美丽塔 美丽塔 I 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴…

Keil 无法烧写程序

问题描述&#xff1a; Keil MDK V5.38 按 F8 键无法烧录程序&#xff0c;提示: Error: Flash Download failed - "Cortex-M7", No Algorithm found for: 08000000H - 080013D3H 解决办法&#xff1a; Debug 工具改为&#xff1a;ST-Link Debugger Debug 的 Conne…

【C++】STL之list深度剖析及模拟实现

目录 前言 一、list 的使用 1、构造函数 2、迭代器 3、增删查改 4、其他函数使用 二、list 的模拟实现 1、节点的创建 2、push_back 和 push_front 3、普通迭代器 4、const 迭代器 5、增删查改(insert、erase、pop_back、pop_front) 6、构造函数和析构函数 6.1、默认构造…

Qt QCustomPlot介绍

介绍 主要介绍qcustomplot及其用法 最新版本:QCustomPlot Patch Release 2.1.1//November 6, 2022 下载:https://www.qcustomplot.com/index.php/download 官网:https://www.qcustomplot.com/index.php 简单使用 mainwindow.h /**************************************…

【pytest】 参数化@pytest.mark.parametrize

1.创建 test_parametrize.py 通过 pytest.mark.parametrize 方法设置参数 import pytestimport math#pytest参数化 pytest.mark.parametrize("base,exponent,expected", # 参数变量名称# 每个元组都是一条测试用例测试数据[(2,2,4),(3,3,9),(1,9,1),(0,9,0)],i…

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接&#xff1a;http://tecdat.cn/?p24492 此分析的目的是构建一个过程&#xff0c;以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括 1258 天的股票收益&#xff08;点击文末“阅读原文”获取完整代码数…

Java————网络编程

一 、网络编程基础 1. 为什么需要网络编程 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c; 如优酷看视频&#xff0c;实质是通过网络&#xff0c; 获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。 相比本地资…

汽车电子——产品标准规范汇总和梳理(车载网络)

文章目录 前言 一、菊花链 二、K Line 三、L Line 四、RS485 五、LIN 六、CAN 七、FlexRay 八、MOST 九、Bluetooth 十、LAN 十一、移动网络 十二、实施和测试 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、菊花链 暂无统一的正式标准。 菊花链通信&…

Linux查看系统信息

# 查看操作系统的详细信息 uname -a# 查看已安装的Linux发行版信息 cat /etc/os-release# 查看Linux Standard Base (LSB)的信息 lsb_release -a# 查看主机的信息 hostnamectl# 查看文件系统的磁盘空间使用情况 df -h# 查看系统内存的使用情况 free -h# 查看网络接口的信息 ifc…

[React] react-hooks如何使用

react-hooks思想和初衷&#xff0c;也是把组件&#xff0c;颗粒化&#xff0c;单元化&#xff0c;形成独立的渲染环境&#xff0c;减少渲染次数&#xff0c;优化性能。 文章目录 1.为什么要使用hooks2.如何使用hooks2.1 useState2.2 useEffect2.3 useLayoutEffect2.4 useRef2.5…

【网络编程】TCP Socket编程

TCP Socket编程 1. ServerSocket2. Socket3. TCP的长短连接4. Socket 通信模型5. 代码示例&#xff1a;TCP 回显服务器 流套接字&#xff1a; 使用传输层TCP协议 TCP: 即Transmission Control Protocol&#xff08;传输控制协议&#xff09;&#xff0c;传输层协议。 TCP的特点…

【计算机网络】IP协议(下)

文章目录 1. 特殊的IP地址2. IP地址的数量限制3. 私有IP地址和公网IP地址私有IP为什么不能出现在公网上&#xff1f;解决方案——NAT技术的使用 4. 路由5. IP分片问题为什么要进行切片&#xff1f;如何做的分片和组装&#xff1f;16位标识3位标志13位片偏移例子 细节问题如何区…

基于springboot地方废物回收机构管理系统springboot11

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

智慧农业农场小程序源码 智慧农场系统源码

智慧农业农场小程序源码 智慧农场系统源码 一、 智慧农场系统的组成 智慧农场系统一般包括传感器、控制器、数据采集与处理平台、应用软件等组成部分。其中, 传感器主要用于采集土壤温度、湿度、光照强度等环境参数,以及作物生长状态、水肥情况等生产信息。控制器则根据传感器…

GLTF编辑器的另一个作用

1、GLB模型介绍 GLB&#xff08;GLTF Binary&#xff09;是一种用于表示三维模型和场景的文件格式。GLTF是"GL Transmission Format"的缩写&#xff0c;是一种开放的、跨平台的标准&#xff0c;旨在在各种3D图形应用程序和引擎之间进行交换和共享。 GLB文件是GLTF文件…

PyCharm 手动下载插件

插件模块一直加载失败&#xff0c;报错信息&#xff1a; Marketplace plugins are not loaded. Check the internet connection and refresh. 尝试了以下方法&#xff0c;均告失败&#xff1a; pip 换源Manage Plugin Repositories...HTTP 代理设置...关闭三个防火墙 最后选…

RK3568平台开发系列讲解(工具命令篇)ADB的安装

🚀返回专栏总目录 文章目录 一、ADB介绍二、Windows 下安装 adb 工具沉淀、分享、成长,让自己和他人都能有所收获!😄 一、ADB介绍 adb 全称 Android Debug Bridge,直译过来就是 Android 调试桥,它是一个通用的命令行工具。adb 做为 Android 设备与 PC 端连接的一个桥梁…

MissionPlanner编译过程

环境 windows 10 mission planner 1.3.80 visual studio 2022 git 2.22.0 下载源码 (已配置git和ssh) 从github上克隆源码 git clone gitgithub.com:ArduPilot/MissionPlanner.git进入根目录 cd MissionPlanner在根目录下的ExtLibs文件下是链接的其它github源码&#xff0…