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.pswp.cn/web/65016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65016.shtml
英文地址,請注明出處:http://en.pswp.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;使得網絡的預測輸出與真實輸出之間…