【保姆級教程】基于anji-plus-captcha實現行為驗證碼(滑動拼圖+點選文字),前后端完整代碼奉上!

前言

驗證碼作為Web應用的第一道安全防線,其重要性不言而喻。但你是否還在為以下問題煩惱:

  • 傳統字符驗證碼用戶體驗差,識別率低?
  • 驗證碼安全性不足,輕易被爬蟲破解?
  • 前后端對接繁瑣,集成效率低?

今天給大家推薦一款國產開源神級驗證碼框架——anji-plus-captcha,它不僅支持滑動拼圖、點選文字兩種主流驗證方式,還提供了Spring Boot原生集成方案,5分鐘就能搞定驗證碼功能!本文將從環境搭建到實戰部署,手把手教你實現企業級行為驗證碼,文末附完整源碼。

一、為什么選擇anji-plus-captcha?

在介紹實戰前,先聊聊這款框架的核心優勢,看完你就知道為什么它能成為開源驗證碼領域的佼佼者:

  1. 雙模式支持:同時提供滑動拼圖和點選文字兩種驗證方式,可根據業務場景靈活切換
  2. 開箱即用:提供Spring Boot Starter,零配置快速集成,無需編寫冗余代碼
  3. 分布式友好:原生支持Redis緩存,輕松應對集群部署,解決session共享問題
  4. 高安全性:基于行為軌跡分析,有效抵御自動化工具攻擊,驗證碼過期自動清理
  5. 高度可定制:支持自定義字體、背景圖、驗證邏輯,滿足個性化需求
  6. 完善文檔:提供詳盡的官方文檔和示例代碼,降低學習成本

官網地址:https://ajcaptcha.beliefteam.cn/captcha-doc/captchaDoc/html.html
開源倉庫:https://gitee.com/belief-team/captcha(星標1.2k+)

二、環境準備與依賴引入

2.1 開發環境

  • JDK 1.8+
  • Spring Boot 2.3.x ~ 2.7.x(親測兼容)
  • Maven 3.6+
  • Redis 6.0+(可選,分布式部署需用到)

2.2 引入依賴

pom.xml中添加核心依賴,Spring Boot項目無需額外配置:

<!-- anji-plus-captcha 核心依賴 -->
<dependency><groupId>com.anji-plus</groupId><artifactId>captcha-spring-boot-starter</artifactId><version>1.4.0</version> <!-- 最新穩定版 -->
</dependency><!-- Spring Boot Web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- Redis依賴(分布式部署必選) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

三、后端實戰:5分鐘搭建驗證碼服務

3.1 核心配置(application.yml)

server:port: 8080servlet:context-path: /demo# 驗證碼核心配置
captcha:# 緩存類型:memory(內存)、redis(分布式)cache-type: redis# 驗證碼類型:blockPuzzle(滑動拼圖)、clickWord(點選文字)mode: clickWord# 點選文字數量(僅clickWord模式有效)click-word-count: 3# 容錯率(0-1之間,值越大容錯性越強)accuracy: 0.8# 圖片寬度(px)width: 350# 圖片高度(px)height: 200# 驗證碼過期時間(秒)expire-second: 120# Redis配置(cache-type=redis時必填)
spring:redis:host: localhostport: 6379password: 123456  # 替換為你的Redis密碼database: 0timeout: 2000ms

3.2 后端接口實現(官方標準接口)

根據官網文檔,anji-plus-captcha定義了3個核心接口,我們只需編寫控制器暴露這些接口即可:

package com.example.captcha.controller;import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 驗證碼控制器(遵循官方接口規范)*/
@RestController
@RequestMapping("/captcha")
public class CaptchaController {@Autowiredprivate CaptchaService captchaService;/*** 1. 獲取驗證碼(官方標準接口)* 請求URL:/captcha/get* 請求方式:POST*/@PostMapping("/get")public ResponseModel getCaptcha(@RequestBody CaptchaVO captchaVO) {return captchaService.getCaptcha(captchaVO);}/*** 2. 校驗驗證碼(官方標準接口)* 請求URL:/captcha/check* 請求方式:POST*/@PostMapping("/check")public ResponseModel checkCaptcha(@RequestBody CaptchaVO captchaVO) {return captchaService.check(captchaVO);}/*** 3. 二次驗證(可選,用于業務接口最終校驗)* 請求URL:/captcha/verify* 請求方式:POST*/@PostMapping("/verify")public ResponseModel verifyCaptcha(@RequestBody CaptchaVO captchaVO) {return captchaService.verification(captchaVO);}
}

關鍵說明

  • 接口路徑嚴格遵循官網規范:/captcha/get/captcha/check/captcha/verify
  • 無需編寫Service層代碼,框架已通過CaptchaService提供了所有核心實現
  • ResponseModel為框架統一響應對象,包含success(是否成功)、msg(提示信息)、data(業務數據)

四、前端實戰:jQuery集成指南(附完整代碼)

前端集成是很多開發者容易踩坑的地方,按照官網規范,需使用框架提供的專用JS庫,而非普通AJAX請求。

4.1 引入前端資源

<!-- 基礎依賴 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script><!-- 驗證碼核心資源(必須按此順序引入) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@anji-plus/captcha@1.4.0/dist/css/verify.css">
<script src="https://cdn.jsdelivr.net/npm/@anji-plus/captcha@1.4.0/dist/js/crypto-js.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@anji-plus/captcha@1.4.0/dist/js/aes.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@anji-plus/captcha@1.4.0/dist/js/verify.js"></script>

4.2 點選文字驗證碼實現(彈出模式)

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>點選文字驗證碼示例</title><!-- 引入資源(同上) -->
</head>
<body><h3>點選文字驗證碼(彈出模式)</h3><!-- 驗證碼容器 --><div id="pointCaptchaContainer"></div><!-- 觸發按鈕(彈出模式必備) --><button id="pointVerifyBtn" style="padding: 10px 20px; margin-top: 20px;">點擊驗證</button><script>// 初始化點選驗證碼(彈出模式)$('#pointCaptchaContainer').pointsVerify({// 后端接口基礎地址(必須與后端context-path一致)baseUrl: '/demo/captcha',// 顯示模式:pop(彈出式)、fixed(固定式)mode: 'pop',// 彈出模式觸發按鈕ID(必須與按鈕id一致)containerId: 'pointVerifyBtn',// 圖片尺寸imgSize: {width: '350px',height: '200px'},// 驗證成功回調success: function(params) {console.log('驗證成功,返回參數:', params);alert('驗證成功!二次驗證參數:' + params.captchaVerification);// 此處可調用業務接口,將params.captchaVerification傳遞給后端進行二次校驗// $.post('/demo/login', {//     username: 'test',//     password: '123',//     captchaVerification: params.captchaVerification// }, function(res) { ... });},// 驗證失敗回調error: function() {alert('驗證失敗,請重試!');},// 驗證碼加載完成回調ready: function() {console.log('點選驗證碼初始化完成');}});</script>
</body>
</html>

4.3 滑動拼圖驗證碼實現(固定模式)

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>滑動拼圖驗證碼示例</title><!-- 引入資源(同上) -->
</head>
<body><h3>滑動拼圖驗證碼(固定模式)</h3><!-- 驗證碼容器(固定模式直接顯示在此處) --><div id="slideCaptchaContainer" style="margin-top: 20px;"></div><script>// 初始化滑動驗證碼(固定模式)$('#slideCaptchaContainer').slideVerify({baseUrl: '/demo/captcha',mode: 'fixed',// 滑動條提示文字explain: '向右滑動完成驗證',// 圖片尺寸imgSize: {width: '350px',height: '200px'},// 滑動條尺寸barSize: {width: '350px',height: '40px'},// 驗證成功回調success: function(params) {console.log('滑動驗證成功,返回參數:', params);alert('滑動驗證成功!');},// 驗證失敗回調error: function() {alert('滑動失敗,請重試!');}});</script>
</body>
</html>

前端核心配置說明

  • baseUrl必須包含后端context-path(如示例中的/demo),否則會出現404錯誤
  • modepop時,containerId必須與觸發按鈕的id一致
  • success回調中的params.captchaVerification是二次驗證的關鍵參數,需傳遞給業務接口

五、高級特性:自定義驗證碼資源

5.1 自定義字體庫

  1. src/main/resources目錄下創建font文件夾,放入字體文件(如simhei.ttf
  2. application.yml中配置字體路徑:
captcha:font-path:- classpath:font/simhei.ttf  # 支持多個字體文件,隨機使用

5.2 自定義背景圖

  1. src/main/resources目錄下創建captcha/background文件夾,放入背景圖片(jpg/png格式)
  2. 配置自定義背景圖:
captcha:# 啟用自定義背景圖use-custom-background: true# 背景圖目錄background-image-dir: classpath:captcha/background

六、避坑指南:新手常遇問題解決方案

  1. 后端接口404錯誤

    • 檢查baseUrl是否包含context-path(如/demo/captcha而非/captcha
    • 確認接口路徑是否為/captcha/get/captcha/check(嚴格區分大小寫)
  2. 驗證碼圖片加載失敗

    • 檢查Redis是否啟動,配置是否正確(cache-type=redis時必須)
    • 查看后端日志,是否有字體文件加載失敗的錯誤(需確保字體文件存在)
  3. 前端報“containerId不存在”

    • mode=pop時,containerId必須與觸發按鈕的id完全一致
    • 確保初始化代碼在DOM加載完成后執行(可放入$(document).ready()中)
  4. 驗證成功但業務接口提示“驗證碼已失效”

    • 檢查expire-second配置,避免過期時間過短
    • 確保success回調中及時調用業務接口(驗證碼過期前)

七、效果演示與源碼獲取

7.1 點選驗證碼效果

在這里插入圖片描述

7.2 滑動驗證碼效果

在這里插入圖片描述

7.3 完整源碼獲取

關注公眾號【豌豆哥哥】,回復“驗證碼”即可獲取完整項目源碼,包含前后端所有代碼和配置文件。

總結

本文詳細介紹了如何基于anji-plus-captcha實現企業級行為驗證碼,從環境搭建到高級定制,涵蓋了開發過程中的各個關鍵環節。這款框架憑借其易用性和強大的功能,非常適合中小型項目快速集成驗證碼功能。

相比傳統驗證碼,行為驗證碼在安全性和用戶體驗上都有明顯優勢,而anji-plus-captcha則是Java生態中為數不多的優秀開源方案。希望本文能幫助你快速掌握驗證碼開發技巧,讓你的項目安全又好用!

如果覺得本文對你有幫助,別忘了點贊+收藏+關注,后續會分享更多Java實戰教程!

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

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

相關文章

HTML-八股

1、DOM和BOM DOM是表示HTML或者XML文檔的標準的對象模型&#xff0c;將文檔中每個組件&#xff08;元素、屬性等&#xff09;都作為一個對象&#xff0c;使用JS來操作這個對象&#xff0c;從而動態改變頁面內容&#xff0c;結合等。 DOM是以樹型結構組織文檔內容&#xff0c;樹…

ADI的EV-21569-SOM核心板和主板轉接卡的鏈接說明

ADI提供給客戶很多DSP的核心板&#xff0c;比如EV-21569-SOM&#xff0c;EV-21593-SOM&#xff0c;EV-SC594-SOM等&#xff0c;非常多&#xff0c;但是沒有底板&#xff0c;光一個核心板怎么用呢&#xff1f;于是我就在想&#xff0c;我的21569評估板就有通用底板&#xff0c;能…

基于 Redisson 實現分布式系統下的接口限流

在高并發場景下&#xff0c;接口限流是保障系統穩定性的重要手段。常見的限流算法有漏桶算法、令牌桶算法等&#xff0c;而單機模式的限流方案在分布式集群環境下往往失效。本文將介紹如何利用 Redisson 結合 Redis 實現分布式環境下的接口限流&#xff0c;確保集群中所有節點的…

ubuntu播放rosbag包(可鼠標交互)

1 前言 眾所周知&#xff0c;ubuntu中播放bag包最主要的工具是rviz&#xff0c;然而rviz有一個無法忍受的缺陷就是不支持鼠標回滾&#xff0c;并且顯示的時間的ros時間&#xff0c;不是世界時間&#xff0c;因此在遇到相關bug時不能與對應的世界時間對應。基于以上&#xff0c…

一文理解緩存的本質:分層架構、原理對比與實戰精粹

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry 一文理解緩存的本質&#xff1a;分層架構、原理對比與實戰精粹 “緩存讓系統飛起來”——但每一層緩存有何不同&#xff1f;…

【離線數倉項目】——電商域DIM層開發實戰

摘要本文主要介紹了電商域離線數倉項目中DIM層的開發實戰。首先闡述了DIM層的簡介、作用、設計特征、典型維度分類以及交易支付場景下的表示例和客戶維度表設計。接著介紹了DIM層設計規范&#xff0c;包括表結構設計規范、數據處理規范以及常見要求規范。然后詳細講解了DIM層的…

Unreal Engine 自動設置圖像

void UYtGameSettingSubsystem::RunHardwareBenchmark(int32 WorkScale, float CPUMultiplier, float GPUMultiplier) {UGameUserSettings* UserSettings UGameUserSettings::GetGameUserSettings();if (UserSettings){// 運行基準測試&#xff08;異步操作&#xff0c;可能需…

使用Spring Boot和PageHelper實現數據分頁

在Spring Boot項目中&#xff0c;利用PageHelper插件可以輕松實現數據分頁功能。以下是具體的實現步驟和代碼示例。添加依賴在項目的pom.xml文件中添加PageHelper和MyBatis的依賴。<dependency><groupId>com.github.pagehelper</groupId><artifactId>p…

【IT-Infra】從ITIL到CMDB,配置管理,資產管理,物理機與設備管理(含Infra系列說明)

【IT-Infra】從ITIL到CMDB&#xff0c;配置管理&#xff0c;資產管理&#xff0c;物理機與設備管理&#xff08;含Infra系列說明&#xff09; 文章目錄序&#xff1a;Infra系列說明1、ITIL 信息技術基礎架構庫&#xff08;起源&#xff09;2、CMDB 配置管理數據庫&#xff08;I…

vue使用printJS實現批量打印及單個打印 避免空白頁

本文介紹了使用print-js庫實現批量打印功能的實現方法。通過安裝print-js依賴后,創建一個batchPrintAction方法,該方法接收選中行數據,生成包含多個標簽頁的HTML字符串。每個標簽頁以表格形式展示6個數據字段,并設置了80mm50mm的標簽尺寸。方法使用PrintJS進行打印,配置了…

C++ 選擇排序、冒泡排序、插入排序

選擇排序&#xff1a;是一種簡單直觀的排序算法&#xff0c;每次均是選擇最小&#xff08;大&#xff09;的元素進行排序。選擇排序算法思想&#xff1a;1 在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置2 再從剩余未排序元素中繼…

Linux入門篇學習——Linux 編寫第一個自己的命令,make 工具和 makefile 文件

目錄 一、Linux 編寫第一個自己的命令 1.命令的概念 2.定義一個自己的命令 二、make 工具和 makefile 文件 1.使用 make 工具 2.makefile文件 一、Linux 編寫第一個自己的命令 1.命令的概念 命令就是可執行程序。 比如說我們輸入 ls -al &#xff0c;ls 就是可執行程序的…

實驗一 接蘋果

主要步驟蘋果樹制作&#xff08;蘋果與籃子的制作同理&#xff09;為蘋果添加標簽相機位置設置與游戲面板長寬比設置&#xff08;16:9&#xff09;蘋果下落設置&#xff08;將蘋果從平拋運動改為垂直下落&#xff09;通過設置物理圖層并更改碰撞矩陣表實現通過PlayerPrefs實現游…

Nginx服務器集群:橫向擴展與集群解決方案

橫向擴展&#xff1a;基礎概念 在深入了解Nginx的橫向擴展細節之前&#xff0c;首先理解橫向擴展的含義及其重要性。橫向擴展是指通過增加服務器數量來分散負載并提升整體性能。這與縱向擴展形成對比&#xff0c;縱向擴展是指在單個服務器上增加更多資源&#xff08;如CPU、內…

缺陷的生命周期(Bug Life Cycle)是什么?

一、缺陷生命周期的定義缺陷生命周期是指一個Bug從被發現到最終關閉的完整流程&#xff0c;反映了缺陷在不同角色&#xff08;測試、開發、產品等&#xff09;間的流轉狀態。它是軟件測試流程的核心管理模型&#xff0c;直接影響團隊協作效率。二、標準缺陷生命周期階段以下是通…

AtCoder Beginner Contest 333(A,B,C,D,E,F)

AtCoder Beginner Contest 333 A 題意 輸出n個n(n<9) 代碼 #include<bits/stdc.h> using namespace std; void solve(){int n;cin>>n;for(int i1;i<n;i)cout<<n; } signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T__1;//cin…

留學真相:凌晨兩點被海關攔下時,我才明白人生沒有退路

> 獨立不是選擇&#xff0c;而是生存的必修課下飛機那一刻&#xff0c;幻想中的“鍍金生活”瞬間崩塌。倫敦海關凌晨兩點的燈光下&#xff0c;你顫抖著翻找學校文件&#xff0c;手機信號格空空如也&#xff1b;大巴誤點后&#xff0c;你拖著兩個32公斤的行李箱站在陰雨中&am…

探索AIGC領域DALL·E 2的圖像生成與人類創意的融合

探索AIGC領域DALLE 2的圖像生成與人類創意的融合關鍵詞&#xff1a;AIGC、DALLE 2、圖像生成、人類創意、創意融合摘要&#xff1a;本文聚焦于AIGC領域中DALLE 2的圖像生成技術與人類創意的融合。首先介紹了相關背景&#xff0c;包括DALLE 2的發展歷程和人類創意在藝術創作中的…

【ECharts】多個ECharts版本共存解決方案

多個ECharts版本共存解決方案 在單個HTML頁面中使用多個ECharts版本的關鍵在于避免全局命名空間沖突。下面我將展示一個完整的解決方案&#xff0c;包含兩種不同的實現方法。 解決方案思路命名空間隔離法&#xff1a; 使用不同的全局變量名保存不同版本的ECharts在加載新版本前…

力扣熱門算法題 204.計數質數,207.課程表,213.打家劫舍II

力扣熱門算法題 204.計數質數&#xff0c;207.課程表&#xff0c;213.打家劫舍II&#xff0c;每題做詳細思路梳理&#xff0c;配套Python&Java雙語代碼&#xff0c; 2025.07.07 可通過leetcode所有測試用例。 目錄 204.計數質數 解題思路 完整代碼 207.課程表 解題思…