SpringBoot 集成滑塊驗證碼AJ-Captcha行為驗證碼 Redis分布式 接口限流 防爬蟲

介紹

滑塊驗證碼比傳統的字符驗證碼更加直觀和用戶友好,能夠很好防止爬蟲獲取數據。

AJ-Captcha行為驗證碼,包含滑動拼圖、文字點選兩種方式,UI支持彈出和嵌入兩種方式。后端提供Java實現,前端提供了php、angular、html、vue、uni-app、flutter、android、ios等代碼示例。

開源地址: https://gitee.com/anji-plus/captcha
官方文檔: https://ajcaptcha.beliefteam.cn/captcha-doc

效果圖

在這里插入圖片描述

依賴

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><dependency><groupId>com.anji-plus</groupId><artifactId>captcha-spring-boot-starter</artifactId><version>1.4.0</version>
</dependency>

Redis配置

spring:redis:host: 127.0.0.1port: 6379password:database: 1timeout: 6000

驗證碼配置

aj:captcha:# 滑動驗證底圖路徑,不配置將使用默認圖片jigsaw: classpath:images/jigsaw# 滑動驗證底圖路徑,不配置將使用默認圖片pic-click: classpath:images/pic-click# 緩存類型設置,默認使用local緩存cache-type: redis# local緩存的閾值, 達到此值后清除緩存cache-number: 1000# local定時清除過期緩存(單位秒), 設置為0表示不執行timing-clear: 180# 驗證碼類型,default代表兩種都實例化type: default# 右下角水印文字,使用Unicode表示# 漢字統一使用Unicode,保證程序通過@value讀取到是中文,可通過這個在線轉換;yml格式不需要轉換# https://tool.chinaz.com/tools/unicode.aspx 中文轉Unicodewater-mark: "\u6211\u7684\u6c34\u5370"  # Unicode: 我的水印# 水印字體(可選配置,默認為文泉驛正黑)# water-font: WenQuanZhengHei.ttf# 滑動拼圖允許的誤差偏移量(默認5像素)slip-offset: 5# AES加密坐標開啟或者禁用 (true 或 false)aes-status: true# 滑動驗證干擾項配置 (0、1、2)interference-options: 2# 點選驗證碼字體樣式 (默認Font.BOLD)font-style: 1# 點選字體的大小font-size: 25# 歷史數據清除配置,是否啟用history-data-clear-enable: false# 接口請求頻率限制配置req-frequency-limit-enable: false# 驗證失敗次數達到限制后,get接口將被鎖定req-get-lock-limit: 5# 驗證失敗后,鎖定時間間隔(秒)req-get-lock-seconds: 360# get接口一分鐘內請求次數限制req-get-minute-limit: 30# check接口一分鐘內請求次數限制req-check-minute-limit: 60# verify接口一分鐘內請求次數限制req-verify-minute-limit: 60

配置類

@Configuration
@RequiredArgsConstructor
public class CaptchaConfig {private  final StringRedisTemplate redisTemplate;@Bean(name = "AjCaptchaCacheService")@Primarypublic CaptchaCacheService captchaCacheService(AjCaptchaProperties config){//緩存類型redis/local/....CaptchaCacheService ret = CaptchaServiceFactory.getCache(config.getCacheType().name());if(ret instanceof CaptchaCacheServiceRedisImpl){((CaptchaCacheServiceRedisImpl)ret).setStringRedisTemplate(redisTemplate);}return ret;}/*** 國際化配置* @return*/
//    @Bean
//    @ConditionalOnMissingBean
//    public MessageSource messageSource() {
//        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
//        messageSource.setBasenames("messages/messages","captcha/messages");
//        messageSource.setDefaultEncoding("UTF-8");
//        return messageSource;
//    }
}

實現類

/*** 對于分布式部署的應用,我們建議應用自己實現CaptchaCacheService,比如用Redis,參考service/spring-boot代碼示例。* 如果應用是單點的,也沒有使用redis,那默認使用內存。* 內存緩存只適合單節點部署的應用,否則驗證碼生產與驗證在節點之間信息不同步,導致失敗。** ☆☆☆ SPI: 在resources目錄新建META-INF.services文件夾(兩層),參考當前服務resources。* @Title: 使用redis緩存* @author Devli* @date 2020-05-12*/
public class CaptchaCacheServiceRedisImpl implements CaptchaCacheService {@Overridepublic String type() {return "redis";}private static final String LUA_SCRIPT = "local key = KEYS[1] " +"local incrementValue = tonumber(ARGV[1]) " +"if redis.call('EXISTS', key) == 1 then " +"    return redis.call('INCRBY', key, incrementValue) " +"else " +"    return incrementValue " +"end";public void setStringRedisTemplate(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate = stringRedisTemplate;}private StringRedisTemplate stringRedisTemplate;@Overridepublic void set(String key, String value, long expiresInSeconds) {stringRedisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS);}@Overridepublic boolean exists(String key) {return stringRedisTemplate.hasKey(key);}@Overridepublic void delete(String key) {stringRedisTemplate.delete(key);}@Overridepublic String get(String key) {return stringRedisTemplate.opsForValue().get(key);}@Overridepublic Long increment(String key, long val) {// 執行 Lua 腳本RedisScript<Long> script = new DefaultRedisScript<>(LUA_SCRIPT, Long.class);// 執行 Lua 腳本return stringRedisTemplate.execute(script,Collections.singletonList(key),String.valueOf(val));}@Overridepublic void setExpire(String key, long l) {stringRedisTemplate.expire(key, l, TimeUnit.SECONDS);}
}

動態實現類

resources/META-INF/services/com.anji.captcha.service.CaptchaCacheService
內容:com.captcha.service.CaptchaCacheServiceRedisImpl --實現類的包路徑
在這里插入圖片描述

Java SPI 機制概述 Java SPI
機制允許開發者為某些接口提供實現,而不需要直接修改應用程序的源代碼。通過這種方式,應用程序能夠在運行時動態地加載接口的實現類。常見的使用場景包括數據庫驅動、日志框架等。

獲取驗證碼

@RestController
@RequiredArgsConstructor
@RequestMapping("/captcha")
public class CaptchaController {private final CaptchaService captchaService;@PostMapping("/getCaptcha")public R get(@RequestBody CaptchaVO data) {return R.success("獲取成功",captchaService.get(data));}//@PostMapping("/check")// public ResponseModel check(@RequestBody CaptchaVO data) {//  return captchaService.check(data);// }}

響應參數

{"repCode": "0000","repData": {"originalImageBase64": "底圖base64","point": {    //默認不返回的,校驗的就是該坐標信息,允許誤差范圍"x": 205,"y": 5},"jigsawImageBase64": "滑塊圖base64","token": "71dd26999e314f9abb0c635336976635", //一次校驗唯一標識"secretKey": "16位隨機字符串", //aes秘鑰,開關控制,前端根據此值決定是否加密"result": false,"opAdmin": false},"success": true,"error": false
}

請求參數

{"captchaType": "blockPuzzle",  //驗證碼類型 clickWord"clientUid": "唯一標識"  //客戶端UI組件id,組件初始化時設置一次,UUID(非必傳參數)
}

緩存信息

在這里插入圖片描述

后端驗證

@PostMapping("/login")
public ResponseModel get(@RequestParam("captchaVerification") String captchaVerification) {CaptchaVO captchaVO = new CaptchaVO();captchaVO.setCaptchaVerification(captchaVerification);ResponseModel response = captchaService.verification(captchaVO);if(response.isSuccess() == false){//驗證碼校驗失敗,返回信息告訴前端//repCode  0000  無異常,代表成功//repCode  9999  服務器內部異常//repCode  0011  參數不能為空//repCode  6110  驗證碼已失效,請重新獲取//repCode  6111  驗證失敗//repCode  6112  獲取驗證碼失敗,請聯系管理員}return response;
}

前端請求

{"captchaType": "blockPuzzle","pointJson": "QxIVdlJoWUi04iM+65hTow==",  //aes加密坐標信息"token": "71dd26999e314f9abb0c635336976635"  //get請求返回的token
}

自定義驗證碼

配置文件開啟

aj:captcha:# 滑動驗證底圖路徑,不配置將使用默認圖片jigsaw: classpath:images/jigsaw

路徑格式
images/jigsaw
- original 背景圖
- slidingBlock 驗證碼塊
在這里插入圖片描述

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

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

相關文章

邊緣網關(邊緣計算)

邊緣網關是邊緣計算架構中的關鍵組件&#xff0c;充當連接終端設備&#xff08;如傳感器、IoT設備&#xff09;與云端或核心網絡的橋梁。它在數據源頭附近進行實時處理、分析和過濾&#xff0c;顯著提升效率并降低延遲。 核心功能 協議轉換 ○ 支持多種通信協議&#xff08;如…

OpenCV定位地板上的書

任務目標是將下面的圖片中的書本找出來&#xff1a; 使用到的技術包括&#xff1a;轉灰度圖、提取顏色分量、二值化、形態學、輪廓提取等。 我們嘗試先把圖片轉為灰度圖&#xff0c;然后二值化&#xff0c;看看效果&#xff1a; 可以看到&#xff0c;二值化后&#xff0c;書的…

機器學習第一講:機器學習本質:讓機器通過數據自動尋找規律

機器學習第一講&#xff1a;機器學習本質&#xff1a;讓機器通過數據自動尋找規律 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1a;超詳細手把手指…

修改圖像分辨率

在這個教程中&#xff0c;您將學習如何使用Python和深度學習技術來調整圖像的分辨率。我們將從基礎的圖像處理技術開始&#xff0c;逐步深入到使用預訓練的深度學習模型進行圖像超分辨率處理。 一、常規修改方法 1. 安裝Pillow庫 首先&#xff0c;你需要確保你的Python環境中…

jsAPI

環境準備 1 安裝nvm nvm 即 (node version manager)&#xff0c;好處是方便切換 node.js 版本 安裝注意事項 要卸載掉現有的 nodejs提示選擇 nvm 和 nodejs 目錄時&#xff0c;一定要避免目錄中出現空格選用【以管理員身份運行】cmd 程序來執行 nvm 命令首次運行前設置好國…

SCDN是什么?

SCDN是安全內容分發網絡的簡稱&#xff0c;它在傳統內容分發網絡&#xff08;CDN&#xff09;的基礎上&#xff0c;集成了安全防護能力&#xff0c;旨在同時提升內容傳輸速度和網絡安全性。 SCDN的核心功能有&#xff1a; DDoS防御&#xff1a;識別并抵御大規模分布式拒絕服務…

Qt/C++開發監控GB28181系統/實時視頻預覽/視頻點播/rtp解包解碼顯示

一、前言 通過gb28181做實時視頻預覽&#xff0c;也就是視頻點播功能&#xff0c;是最重要的功能了&#xff0c;絕對是整個系統排第一重要的&#xff0c;這就是核心功能&#xff0c;什么設備注冊、獲取通道等都是為了實時預覽做準備的&#xff0c;當然這個功能也是最難的&…

找銀子 題解(c++)

題目 思路 首先&#xff0c;這道題乍一看&#xff0c;應該可以用搜索來做。 但是&#xff0c;搜索會不會超時間限制呢&#xff1f; 為了防止時間超限,我們可以換一種做法。 先創立兩個二維數組&#xff0c;一個是輸入的數組a&#xff0c;一個是數組b。 假設 i 行 j 列的數…

子集樹算法文檔

1.算法概述 子集樹是一種 回溯算法&#xff0c;用于生成一個集合的所有子集。給定一個數組 arr&#xff0c;該算法遞歸地遍歷所有可能的子集&#xff0c;并通過一個輔助數組 x 標記當前元素是否被選中。 2.算法特點 時間復雜度&#xff1a;O(2n)&#xff08;因為一個包含 n 個…

HTTP/1.1 host虛擬主機詳解

一、核心需求&#xff1a;為什么需要虛擬主機&#xff1f; 在互聯網上&#xff0c;我們常常希望在一臺物理服務器&#xff08;它通常只有一個公網 IP 地址&#xff09;上運行多個獨立的網站&#xff0c;每個網站都有自己獨特的域名&#xff08;例如 www.a-site.com?, www.b-s…

amass:深入攻擊面映射和資產發現工具!全參數詳細教程!Kali Linux教程!

簡介 OWASP Amass 項目使用開源信息收集和主動偵察技術執行攻擊面網絡映射和外部資產發現。 此軟件包包含一個工具&#xff0c;可幫助信息安全專業人員使用開源信息收集和主動偵察技術執行攻擊面網絡映射并執行外部資產發現。 使用的信息收集技術 技術數據來源APIs&#xf…

Spring Web MVC響應

返回靜態頁面 第一步 創建html時&#xff0c;要注意創建的路徑&#xff0c;要在static下面 第二步 把需要寫的內容寫到body內 第三步 直接訪問路徑就可以 返回數據ResponseBody RestController Controller ResponseBody Controller&#xff1a;返回視圖 ResponseBody&…

?鴻蒙PC正式發布:國產操作系統實現全場景生態突破

鴻蒙PC正式發布&#xff1a;國產操作系統實現全場景生態突破? 2025年5月8日&#xff0c;華為在深圳舉辦發布會&#xff0c;正式推出搭載鴻蒙操作系統的個人電腦&#xff08;PC&#xff09;&#xff0c;標志著國產操作系統在核心技術與生態布局上實現歷史性跨越。此次發布的鴻蒙…

【計算機視覺】OpenCV實戰項目:Text-Extraction-Table-Image:基于OpenCV與OCR的表格圖像文本提取系統深度解析

Text-Extraction-Table-Image&#xff1a;基于OpenCV與OCR的表格圖像文本提取系統深度解析 1. 項目概述2. 技術原理與算法設計2.1 圖像預處理流水線2.2 表格結構檢測算法2.3 OCR優化策略 3. 實戰部署指南3.1 環境配置3.2 核心代碼解析3.3 執行流程示例 4. 常見問題與解決方案4.…

Redis BigKey 問題是什么

BigKey 問題是什么 BigKey 的具體表現是 redis 中的 key 對應的 value 很大&#xff0c;占用的 redis 空間比較大&#xff0c;本質上是大 value 問題。 BigKey怎么找 redis-cli --bigkeysscanBig Key 產生的原因 1.redis數據結構使用不恰當 2.未及時清理垃圾數據 3.對業務預…

go-gin

前置 gin是go的一個web框架&#xff0c;我們簡單介紹一下gin的使用 導入gin &#xff1a;"github.com/gin-gonic/gin" 我們使用import導入gin的包 簡單示例&#xff1a; package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default(…

C# NX二次開發:判斷兩個體是否干涉和獲取系統日志的UFUN函數

大家好&#xff0c;今天要講關于如何判斷兩個體是否干涉和獲取系統日志的UFUN函數。 &#xff08;1&#xff09;UF_MODL_check_interference&#xff1a;這個函數的定義為根據單個目標體檢查每個指定的工具體是否有干擾。 Defined in: uf_modl.h Overview Checks each sp…

如何解決 Linux 系統文件描述符耗盡的問題

在Linux系統中&#xff0c;文件描述符&#xff08;File Descriptor, FD&#xff09;是操作系統管理打開文件、套接字、管道等資源的抽象標識。當進程或系統耗盡文件描述符時&#xff0c;會導致服務崩潰、連接失敗等嚴重問題。以下是詳細的排查和解決方案&#xff1a; --- ###…

LVGL簡易計算器實戰

文章目錄 &#x1f4c1; 文件結構建議&#x1f539; eval.h 表達式求值頭文件&#x1f539; eval.c 表達式求值實現文件&#xff08;帶詳細注釋&#xff09;&#x1f539; ui.h 界面頭文件&#x1f539; ui.c 界面實現文件&#x1f539; main.c 主函數入口? 總結 項目效果&…

使用countDownLatch導致的線程安全問題,線程不安全的List-ArrayList,線程安全的List-CopyOnWriteArrayList

示例代碼 package com.example.demo.service;import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class UnSafeCDTest {Executor…