使用Kaptcha生成驗證碼

說明:驗證碼,是登錄流程中必不可少的一環,一般企業級的系統,使用都是專門制作驗證碼、審核校驗的第三方SDK(如極驗)。本文介紹,使用谷歌提供的Kaptcha技術,制作一個簡單的驗證碼。

本文參考(http://t.csdn.cn/55Ip2),基本是根據這篇文章自己手動實現了一遍。

后端代碼

創建一個SpringBoot項目,依賴如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>kaptcha_essay</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><!--Springboot項目--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.12</version><relativePath/></parent><dependencies><!--web依賴--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--kaptcha依賴--><dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version></dependency></dependencies></project>

創建一個Kaptcha配置類,用于設置驗證碼的尺寸、樣式等,注意不要漏掉@Component注解如下:

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import java.util.Properties;@Component
public class KaptchConfig {@Beanpublic DefaultKaptcha getDefaultKaptcha() {// 創建驗證碼工具com.google.code.kaptcha.impl.DefaultKaptcha defaultKaptcha = new com.google.code.kaptcha.impl.DefaultKaptcha();// 驗證碼配置Properties properties = new Properties();// 圖片邊框properties.setProperty("kaptcha.border", "no");// 邊框顏色properties.setProperty("kaptcha.border.color", "black");//邊框厚度properties.setProperty("kaptcha.border.thickness", "1");// 圖片寬properties.setProperty("kaptcha.image.width", "120");// 圖片高properties.setProperty("kaptcha.image.height", "60");//圖片實現類properties.setProperty("kaptcha.producer.impl", "com.google.code.kaptcha.impl.DefaultKaptcha");//文本實現類properties.setProperty("kaptcha.textproducer.impl", "com.google.code.kaptcha.text.impl.DefaultTextCreator");//文本集合,驗證碼值從此集合中獲取properties.setProperty("kaptcha.textproducer.char.string", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");//驗證碼長度properties.setProperty("kaptcha.textproducer.char.length", "4");//字體properties.setProperty("kaptcha.textproducer.font.names", "宋體");//字體顏色properties.setProperty("kaptcha.textproducer.font.color", "black");//文字間隔properties.setProperty("kaptcha.textproducer.char.space", "4");//干擾實現類properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.DefaultNoise");//干擾顏色properties.setProperty("kaptcha.noise.color", "blue");//干擾圖片樣式properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.WaterRipple");//背景實現類properties.setProperty("kaptcha.background.impl", "com.google.code.kaptcha.impl.DefaultBackground");//背景顏色漸變,結束顏色properties.setProperty("kaptcha.background.clear.to", "white");//文字渲染器properties.setProperty("kaptcha.word.impl", "com.google.code.kaptcha.text.impl.DefaultWordRenderer");// 創建驗證碼配置實例Config config = new Config(properties);// 驗證碼工具defaultKaptcha.setConfig(config);return defaultKaptcha;}
}

創建一個controller層類,用于生成驗證碼并返回

import com.google.code.kaptcha.impl.DefaultKaptcha;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Map;@RestController
@CrossOrigin
@RequestMapping("/code")
public class KaptchController {@ResourceDefaultKaptcha defaultKaptcha;/*** 生成驗證碼*/@GetMappingpublic Map code() throws IOException {// 生成文字驗證碼String text = defaultKaptcha.createText();System.out.println("文字驗證碼為" + text);ByteArrayOutputStream out = new ByteArrayOutputStream();// 生成圖片驗證碼BufferedImage image = defaultKaptcha.createImage(text);ImageIO.write(image, "jpg", out);// 對字節組Base64編碼return Map.of("data", Base64.getEncoder().encodeToString(out.toByteArray()));}
}

@CrossOrigin注解,用于解決跨域問題,待會兒前端會發送異步請求,獲取驗證碼;

前端代碼

創建一個前端頁面,使用axios向后端發送獲取驗證碼的請求;

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>獲取驗證碼</title><script src="js/axios-0.18.0.js"></script></head><body><input type="button" value="獲取驗證碼" onclick="get()"><img id="pic" />
</body>
<script>function get() {// 異步交互ajaxaxios.get("http://localhost:8080/code") // 發請求給服務器.then(resp => {// 接收響應回來的數據console.log(resp.data);document.getElementById("pic").src = 'data:image/jpeg;base64,' + resp.data.data;})}
</script></html>

啟動&測試

啟動代碼,打開前端頁面,點擊獲取驗證碼,查看結果,如下:

在這里插入圖片描述

控制臺輸出驗證碼,這個驗證碼在實際開發中可存入Redis中;

在這里插入圖片描述

可以前端查看返回的內容;

在這里插入圖片描述

這段地址加上data:image/jpeg;base64,就是驗證碼的圖片地址;

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41065.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41065.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41065.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sqlserver數據庫導出到mysql

愛到分才顯珍貴&#xff0c;很多人都不懂珍惜擁有&#xff0c;只到失去才看到&#xff0c;其實那最熟悉的才最珍貴的。 這里只介紹一種方式&#xff0c;有很多的方式。 1.使用Navicat 安裝 下載 2.工具 數據傳輸 3.選擇源和目標 然后開始 4.最好導入前備份一下庫

【KVM虛擬化環境部署】

環境部署 KVM虛擬化環境 1、裝系統時手動選擇安裝 2、CentOS 7 最小化安裝 yum install qemu-kvm qemu-img libvirt -y yum install virt-install libvirt-python virt-manager python-virtinst libvirt-client -y安裝好CentOS 7后&#xff0c;去設置里面點擊處理器&#x…

4.0 Spring Boot入門

1. Spring Boot概述 Spring Boot介紹 Spring Boot是Pivotal團隊在2014年推出的全新框架&#xff0c;主要用于簡化Spring項目的開發過程&#xff0c;可以使用最少的配置快速創建Spring項目。 Spring Boot版本 2014年4月v1.0.0.RELEASE發布。 ? 2.Spring Boot特性 約定優于配…

docker-compose部署可道云

文章目錄 一. Mac1.1 下載源碼1.2 部署1.2.1 修改密碼部署(可忽略)1.2.2 直接部署 1.3 卸載1.4 訪問 二. Win2.1 下載源碼2.2 部署2.2.1 修改密碼部署(可忽略)2.2.2 直接部署 2.3 卸載 一. Mac 1.1 下載源碼 mkdir -p /Users/wanfei/docker-compose && cd /Users/wan…

mysql 數據備份和恢復

操作系統&#xff1a;22.04.1-Ubuntu mysql 版本&#xff1a;8.033 binlog 介紹 binlog 是mysql 二進制日志 binary log的簡稱&#xff0c;可以簡單理解為數據的修改記錄。 需要開啟binlog,才會產生文件&#xff0c;mysql 8.0 默認開啟,開啟后可以在 /var/lib/mysql &#xff…

技術債 筆記

目錄 1. 技術債 筆記1.1. 什么是技術債1.2. 討論1.3. 國內技術從業者怎么看? 1. 技術債 筆記 1.1. 什么是技術債 1992 年, Ward Cunningham 在敏捷宣言中首次提出了"技術債"概念, 主要指有意或無意地做了錯誤的或不理想的技術決策所累積的債務。隨后, 《重構》一書…

sql中union all、union、intersect、minus的區別圖解,測試

相關文章 sql 的 join、left join、full join的區別圖解總結&#xff0c;測試&#xff0c;注意事項 1. 結論示意圖 對于intersect、minus&#xff0c;oracle支持&#xff0c;mysql不支持&#xff0c;可以變通&#xff08;in或exists&#xff09;實現 2.測試 2.1.創建表和數…

vue pc端項目el-upload上傳圖片時加水印

html代碼&#xff1a; <a-uploadclass"avatar-uploader"list-type"picture-card":file-list"uploadFileList":custom-request"uploadDoneHandle":before-upload"beforeUpload":remove"removeHandle"v-decorat…

案例21 基于Spring Boot+Redis實現圖書信息按書號存儲案例

1. 案例需求 基于Spring BootRedis實現圖書信息按書號存儲和取出功能&#xff0c;數據存儲至Redis。 2. 創建Spring Boot項目 創建Spring Boot項目&#xff0c;項目名稱為springboot-redis02。 3. 選擇依賴 ? pom.xml文件內容如下所示&#xff1a; <?xml version&quo…

瀏覽器控制臺調試代碼和JavaScript控制臺方法介紹

瀏覽器控制臺調試代碼和JavaScript控制臺方法介紹 瀏覽器控制臺調試代碼 瀏覽器控制臺&#xff08;Console&#xff09;是瀏覽器提供的一個開發工具&#xff0c;用于在瀏覽器中執行和調試 JavaScript 代碼。它提供了一個交互式環境&#xff0c;可以輸入 JavaScript 代碼&#…

Qt:隱式內存共享

隱式內存共享 Many C classes in Qt use implicit data sharing to maximize resource usage and minimize copying. Implicitly shared classes are both safe and efficient when passed as arguments, because only a pointer to the data is passed around, and the data i…

C語言:每日一練(選擇+編程)

目錄 選擇題&#xff1a; 題一&#xff1a; 題二&#xff1a; 題三&#xff1a; 題四&#xff1a; 題五&#xff1a; 編程題&#xff1a; 題一&#xff1a;打印1到最大的n位數 示例1 思路一&#xff1a; 題二&#xff1a;計算日期到天數轉換 示例1 思路一&#xf…

【JVM】如何判定一個對象已死以及“標記-清除”、“標記-復制”、“標記-整理”三種垃圾收集算法

文章目錄 0、如何判定一個對象的生死&#xff1f;1、上文提到的引用又是什么1、強引用&#xff1a;2、軟引用&#xff1a;3、弱引用&#xff1a;4、虛引用&#xff1a; 2、垃圾收集算法1、標記-清除2、標記-復制優化&#xff1a;&#x1f447; 3、標記-整理 0、如何判定一個對象…

Java面向對象程序設計——知識、概念、定義及作用(簡答)

?專欄&#xff1a;《Java面向對象程序設計》學習筆記 問題是依據考綱整理的&#xff0c;稍微做了一些補充。大部分答案由GPT生成&#xff0c;部分內容摘選自書本。 內容太多了&#xff0c;目前懶得濃縮精煉了&#xff0c;以后再說吧。 如果有大佬可以幫忙精簡一些文字、補充…

R語言實現神經網絡(1)

#R語言實現神經網絡 library(neuralnet) library(caret) library(MASS) library(vcd) data(shuttle) str(shuttle)#因變量use; table1<-structable(windmagn~use,shuttle) mosaic(table1,shadingT) mosaic(use~errorvis,shuttle) prop.table(table(shuttle$use,shuttle$stab…

計算機網絡-物理層(二)- 傳輸方式

計算機網絡-物理層&#xff08;二&#xff09;- 傳輸方式 串型傳輸與并行傳輸 串行傳輸:是指數據是一個比特一個比特依次發送的&#xff0c;因此在發送端和接收端之間&#xff0c;只需要一條數據傳輸線路即可 并行傳輸:是指一次發送n個比特而不是一個比特&#xff0c;因此發送…

【Uniapp】base64圖片資源轉為本地圖片,解決canvas不支持base64問題

通過接口獲取到base64類型的二維碼&#xff0c;把二維碼放到canvas里生成海報 遇到的問題&#xff1a; 在微信小程序開發工具中能夠正常顯示海報&#xff0c;到真機上測試就無法顯示二維碼 原因&#xff1a; 因為canvas不支持base64&#xff0c;其次在使用小程序 canvas 的 dr…

異常堆棧缺失與OmitStackTraceInFastThrow

目錄 現象原因OmitStackTraceInFastThrow源碼層面分析OmitStackTraceInFastThrow閾值是多少源碼源代碼解釋 現象 異常沒有堆棧信息。只有短短的異常類信息&#xff0c;例如java.lang.NullPointerException。 完整的異常堆棧示例&#xff1a; java.lang.NullPointerException…

爬蟲逆向實戰(十六)--某建筑市場平臺

一、數據接口分析 主頁地址&#xff1a;某建筑市場平臺 1、抓包 通過抓包可以發現數據接口是list 2、判斷是否有加密參數 請求參數是否加密&#xff1f; 無請求頭是否加密&#xff1f; 無響應是否加密&#xff1f; 通過查看“響應”模塊可以發現&#xff0c;返回的響應是…

MAUI+Blazor:windows 打包踩坑

文章目錄 前言MSIX安裝文件如何發布選擇Windows平臺旁加載自定義簽名版本號安裝 總結 前言 最近打算研究一下MAUIBlazor&#xff0c;爭取在今年年底之前徹底搞懂MAUIBlazor的安裝模式&#xff0c; MSIX安裝文件 Windows 4種安裝程序格式MSI&#xff0c;EXE、AppX和MSIX優缺點…