springboot使用hutool captcha +vue实现图形验证码

一、效果

使用hutool captcha实现简单的图形验证码,可以参考官网概述 | Hutool

 二、实现步骤

1、导入依赖

 <!--hutool包-->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

2、后端代码

@RestController
@RequestMapping()
public class CaptchaController {private static final String REDIS_KEY = "captcha";@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("/lineCaptcha")public Result createLineCaptcha() {//创建一个线性验证码图片,并将其输出到浏览器LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(100, 40, 4, 9);//设置验证码内容,并输出到浏览器String code = lineCaptcha.getCode();//redis存储验证码内容//设置验证码有效期为1分钟redisTemplate.opsForValue().set(REDIS_KEY, code, 60, TimeUnit.SECONDS);//获取验证码图片的Base64编码数据String imageBase64Data = lineCaptcha.getImageBase64Data();
//        // 设置正确的 MIME 类型
//        response.setContentType("image/png");
//        lineCaptcha.write(response.getOutputStream());
//        //将验证码内容保存到响应头中,供客户端验证使用
//        response.setHeader("REDIS_KEY", code);return Result.success(imageBase64Data);}@GetMapping("/circleCaptcha")public Result createCircleCaptcha() {CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(100, 40, 4, 9);String code = circleCaptcha.getCode();//redis存储验证码内容//设置验证码有效期为1分钟redisTemplate.opsForValue().set(REDIS_KEY, code, 60, TimeUnit.SECONDS);//获取验证码图片的Base64编码数据String imageBase64Data = circleCaptcha.getImageBase64Data();return Result.success(imageBase64Data);}@GetMapping("/shearCaptcha")public Result createShearCaptcha() {ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(100, 40, 4, 9);String code = shearCaptcha.getCode();//redis存储验证码内容//设置验证码有效期为1分钟redisTemplate.opsForValue().set(REDIS_KEY, code, 60, TimeUnit.SECONDS);//获取验证码图片的Base64编码数据String imageBase64Data = shearCaptcha.getImageBase64Data();return Result.success(imageBase64Data);}@GetMapping("/gifCaptcha")public Result createGifCaptcha() {GifCaptcha gifCaptcha = CaptchaUtil.createGifCaptcha(100, 40, 4);//redis存储验证码内容String code = gifCaptcha.getCode();//设置验证码有效期为1分钟redisTemplate.opsForValue().set(REDIS_KEY, code, 60, TimeUnit.SECONDS);//获取验证码图片的Base64编码数据String imageBase64Data = gifCaptcha.getImageBase64Data();return Result.success(imageBase64Data);}@GetMapping("/diyCharCaptcha")public Result createDiyCharCaptcha() {// 定义图形验证码的长、宽、验证码字符数、干扰线宽度//ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(100, 40, 4, 4);LineCaptcha captcha = CaptchaUtil.createLineCaptcha(100, 40, 4, 4);// 自定义纯数字的验证码(随机4位数字,可重复)RandomGenerator randomGenerator = new RandomGenerator("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 4);// 自定义验证码内容为随机4位字符captcha.setGenerator(randomGenerator);//redis存储验证码内容String code = captcha.getCode();System.out.println("随机4位字符验证码:" + code);String imageBase64Data = captcha.getImageBase64Data();return Result.success(imageBase64Data);}@GetMapping("/diyComputeCaptcha")public Result createDiyComputeCaptcha() {// 定义图形验证码的长、宽、验证码字符数、干扰线宽度LineCaptcha captcha = CaptchaUtil.createLineCaptcha(100, 40, 4, 4);/***   自定义验证码内容为四则运算方式*   numberLength默认为2,即生成的计算式为两个两位数的计算 88+11=*/MathGenerator mathGenerator = new MathGenerator(1);captcha.setGenerator(mathGenerator);//redis存储验证码内容String code = captcha.getCode();System.out.println("四则运算验证码:" + code);// 验证用户输入是否正确String userInputCode = "10";boolean isCorrect = mathGenerator.verify(code, userInputCode);System.out.println("用户输入:" + userInputCode + ",是否正确:" + isCorrect);String imageBase64Data = captcha.getImageBase64Data();return Result.success(imageBase64Data);}
}

 3、前端代码


api

import request from "@/utils/request";/*** 获取验证码** @returns 验证码图片*/
export const getLineCaptcha = () => {return request({url: "/lineCaptcha",method: "get",// responseType: "blob",});
};
export const getCircleCaptcha = () => {return request({url: "/circleCaptcha",method: "get",});
};
export const getShearCaptcha = () => {return request({url: "/shearCaptcha",method: "get",});
};
export const getGifCaptcha = () => {return request({url: "/gifCaptcha",method: "get",});
};
export const getDiyCharCaptcha = () => {return request({url: "/diyCharCaptcha",method: "get",});
};
export const getDiyComputeCaptcha = () => {return request({url: "/diyComputeCaptcha",method: "get",});
};

vue页面

<template><div class="captcha"><h1>验证码</h1><div class="hutoll"><h3>hutool工具</h3><span>LineCaptcha:<img :src="LineCaptcha" alt="验证码" @click="changeCaptchaImg('Line')"/></span><span>CircleCaptcha:<img:src="CircleCaptcha"alt="验证码"@click="changeCaptchaImg('Circle')"/></span><span>ShearCaptcha:<img:src="ShearCaptcha"alt="验证码"@click="changeCaptchaImg('Shear')"/></span><span>GifCaptcha:<img :src="GifCaptcha" alt="验证码" @click="changeCaptchaImg('Gif')"/></span><span>DiyCharCaptcha:<img:src="DiyCharCaptcha"alt="验证码"@click="changeCaptchaImg('DiyChar')"/></span><span>DiyComputeCaptcha:<img:src="DiyComputeCaptcha"alt="验证码"@click="changeCaptchaImg('DiyCompute')"/></span></div></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from "vue";
import {getLineCaptcha,getCircleCaptcha,getShearCaptcha,getGifCaptcha,getDiyCharCaptcha,getDiyComputeCaptcha,} from "@/api/captcha/index";
import { ElMessage } from "element-plus";const LineCaptcha = ref("");
const CircleCaptcha = ref("");
const ShearCaptcha = ref("");
const GifCaptcha = ref("");
const DiyCharCaptcha = ref("");
const DiyComputeCaptcha = ref("");const captchaRefs = {Line: LineCaptcha,Circle: CircleCaptcha,Shear: ShearCaptcha,Gif: GifCaptcha,DiyChar: DiyCharCaptcha,DiyCompute: DiyComputeCaptcha,};const getCaptcha = async (captchaType) => {try {let res;switch (captchaType) {case "Line":res = await getLineCaptcha();break;case "Circle":res = await getCircleCaptcha();break;case "Shear":res = await getShearCaptcha();break;case "Gif":res = await getGifCaptcha();break;case "DiyChar":res = await getDiyCharCaptcha();break;case "DiyCompute":res = await getDiyComputeCaptcha();break;default:throw new Error("Invalid captcha type");}captchaRefs[captchaType].value = res.data;} catch (error) {console.error(`获取 ${captchaType} 验证码时出错:`, error);ElMessage.error(`获取 ${captchaType} 验证码时出错,请稍后再试`);}
};const changeCaptchaImg = async (captchaType) => {await getCaptcha(captchaType);
};const revokeCaptchaUrls = () => {for (const captchaType in captchaRefs) {if (captchaRefs[captchaType].value) {URL.revokeObjectURL(captchaRefs[captchaType].value);}}
};onMounted(async () => {await Promise.all([getCaptcha("Line"),getCaptcha("Circle"),getCaptcha("Shear"),getCaptcha("Gif"),getCaptcha("DiyChar"),getCaptcha("DiyCompute"),]);
});onBeforeUnmount(() => {revokeCaptchaUrls();
});
</script><style lang="scss" scoped></style>

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

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

相关文章

2501d,d的优势之一与C互操作

原文 如前,我已将个人理财包从C移植到D语言,开始时,把里面的一些移植到Rust中,直到我再也受不了了. D和Rust版本中都有读取从美国运通下载的.csv文件的工具之一,并把交易加载到包含财务数据的轻查数据库中,试通过使用基于李文距离的算法的模糊比较问题的描述与现有问题,来为每…

vue3+Echarts+ts实现甘特图

项目场景&#xff1a; vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…

【AIGC-ChatGPT进阶提示词指令】AI美食助手的设计与实现:Lisp风格系统提示词分析

引言 在人工智能助手的应用领域中&#xff0c;美食烹饪是一个既专业又贴近生活的方向。本文将详细分析一个基于Lisp风格编写的美食助手系统提示词&#xff0c;探讨其结构设计、功能实现以及实际应用效果。 提出你的菜系&#xff0c;为你分析&#xff0c;并生成图片卡片 提示词…

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…

MCA:用于图像识别的深度卷积神经网络中的多维协同注意力

摘要 大量先前的研究已经表明,注意力机制在提高深度卷积神经网络(CNNs)性能方面具有巨大潜力。然而,现有的大多数方法要么忽略了在通道和空间维度上同时建模注意力,要么引入了更高的模型复杂度和更重的计算负担。为了缓解这一困境,本文提出了一种轻量级且高效的多维协同…

halcon中图像处理及图像滤波

图像滤波简介 图像滤波的方法主要分为两大类:空间域方法和频域方法。 空间域方法是以对图像的像素直接进行处理为基础,包括均值滤波、中值滤波、高斯滤波等;频域方法则是以修改图像在傅里叶变换空间的值为基础的,包括高通滤波、低通滤波、同态滤波等。 1.空间域图像滤波 图…

【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写

文章目录 一、随机数1、Random.Next()生成随机整数示例&#xff1a;生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例&#xff1a;生成随机浮点数 3、 生成随机字母或字符示例&#xff1a;生成随机字母示例&#xff1a;生成随机小写字母 二、…

吐卡机开发——指令合集—未来之窗行业应用跨平台架构

序号指令10A 09 02 01 01 0D DE20A 09 02 02 01 FD DE30A 09 02 03 01 6D DF40A 09 02 04 01 5D DD50A 09 02 05 01 CD DC60A 09 02 06 01 3D DC70A 09 02 07 01 AD DD80A 09 02 08 01 5D D890A 09 02 09 01 CD D9100A 09 02 10 01 5D D2110A 09 02 11 01 CD D3120A 09 02 12 0…

fpga系列 HDL:verilog 常见错误与注意事项 位宽不匹配+case 语句中没有覆盖所有情况

位宽不匹配问题 信号或操作数的位宽不匹配&#xff0c;可能导致仿真或综合错误。 module top (input wire [3:0] a,output wire [7:0] b );assign b a; endmodulecase 语句中没有覆盖所有情况 module top (input wire [1:0] sel,input wire [7:0] a,input wire [7:0] b,in…

Linux中操作中的无痕命令history技巧

当我们需要查看Linux下的操作记录时&#xff0c;就可以用history命令来查看历史记录 1、关闭history记录功能&#xff0c;如果不想让别人看到自己在Linux上的操作命令&#xff0c;可以用这个命令 set o history 2、打开history记录功能 set -o history3、清空记录 histor…

计算机网络练习题

学习这么多啦&#xff0c;那就简单写几个选择题巩固一下吧&#xff01; 1. 在IPv4分组各字段中&#xff0c;以下最适合携带隐藏信息的是&#xff08;D&#xff09; A、源IP地址 B、版本 C、TTL D、标识 2. OSI 参考模型中&#xff0c;数据链路层的主要功能是&#xff08;…

优化租赁小程序提升服务效率与用户体验的策略与实践

内容概要 在这个快速发展的商业环境中&#xff0c;租赁小程序成为了提升服务效率和用户体验的重要工具。通过对用户需求的深入挖掘&#xff0c;我们发现他们对于功能的便捷性、响应速度和界面的友好性有着极高的期待。因此&#xff0c;针对这些需求&#xff0c;完善租赁小程序…

【数据结构】树链刨分

1 u v k&#xff0c;修改路径上节点权值&#xff0c;将节点 uu 和节点 vv 之间路径上的所有节点&#xff08;包括这两个节点&#xff09;的权值增加 kk。2 u k&#xff0c;修改子树上节点权值&#xff0c;将以节点 uu 为根的子树上的所有节点的权值增加 kk。3 u v&#xff0c;询…

pandas.Grouper() 在实际项目中非常有用,尤其是在处理时间序列数据、财务数据或多级索引数据时

pandas.Grouper() 在实际项目中非常有用&#xff0c;尤其是在处理时间序列数据、财务数据或多级索引数据时。以下是几个实际场景的例子&#xff0c;展示了如何使用 pandas.Grouper() 进行数据分组&#xff0c;并用数值示例说明。 1. 按月分组进行销售数据汇总 场景&#xff1…

private static final Logger log = LoggerFactory.getLogger()和@Slf4j的区别

一、代码方面 - private static final Logger log LoggerFactory.getLogger()方式 详细解释 这是一种传统的获取日志记录器&#xff08;Logger&#xff09;的方式。LoggerFactory是日志框架&#xff08;如 Log4j、Logback 等&#xff09;提供的工厂类&#xff0c;用于创建Lo…

医疗数仓Hive安装部署

Hive安装部署 Hive安装部署 1&#xff09;把hive-3.1.3.tar.gz上传到linux的/opt/software目录下 2&#xff09;解压hive-3.1.3.tar.gz到/opt/module/目录下面 [atguiguhadoop102 software]$ tar -zxvf /opt/software/hive-3.1.3.tar.gz -C /opt/module/3&#xff09;修改hive…

通俗易懂的讲一下Vue的双向绑定和React的单向绑定

1.Vue 的双向绑定&#xff1a; <template><!-- 输入框和数据自动绑定&#xff0c;就像连体婴儿&#xff0c;一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…

使用setup.py打包 HuggingFace PEFT 项目详解:pip install peft的幕后流程

使用 setup.py 打包 HuggingFace PEFT 项目详解 Source: https://github.com/huggingface/peft/blob/main/setup.py 1. 项目简介 HuggingFace 的 PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09;库是一个用于高效参数微调的 Python 工具包&#xff0c;支持多种…

BP神经网络的反向传播算法

BP神经网络&#xff08;Backpropagation Neural Network&#xff09;是一种常用的多层前馈神经网络&#xff0c;通过反向传播算法进行训练。反向传播算法的核心思想是通过计算损失函数对每个权重的偏导数&#xff0c;从而调整权重&#xff0c;使得网络的预测输出与真实输出之间…