簡單介紹
tianai-captcha 目前支持的行為驗證碼型別
滾軸驗證碼
旋轉驗證碼
滑動還原驗證碼
文字點選驗證碼
後面會陸續支持市面上更多好玩的驗證碼玩法... 敬請期待
快速上手
註意: 如果你計畫是使用的 Springboot ,
請使用SpringBoot腳手架工具tianai-captcha-springboot-starter;
該工具對tianai-captcha驗證碼進行了封裝,使其使用更加方便快捷
1. 匯入xml
<!-- maven 匯入 -->
<dependency>
<groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId>
<version>1.4.1</version>
</dependency>
2. 使用
ImageCaptchaGenerator
生成器生成驗證碼
packageexample.readme;
importcloud.tianai.captcha.common.constant.CaptchaTypeConstant;
importcloud.tianai.captcha.generator.ImageCaptchaGenerator;
importcloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
importcloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
importcloud.tianai.captcha.validator.ImageCaptchaValidator;
importcloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator;
importjava.util.Map;
public classTest{
publicstaticvoidmain(String[]args)throwsInterruptedException{
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
ImageTransformimageTransform=newBase64ImageTransform();
ImageCaptchaGeneratorimageCaptchaGenerator=newMultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true);
/*
生成滾軸驗證碼圖片, 可選項
SLIDER (滾軸驗證碼)
ROTATE (旋轉驗證碼)
CONCAT (滑動還原驗證碼)
WORD_IMAGE_CLICK (文字點選驗證碼)
更多驗證碼支持 詳見 cloud.tianai.captcha.common.constant.CaptchaTypeConstant
*/
ImageCaptchaInfoimageCaptchaInfo=imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER);
System.out.println(imageCaptchaInfo);
// 負責計算一些數據存到緩存中,用於校驗使用
// ImageCaptchaValidator負責校驗使用者滑動滾軸是否正確和生成滾軸的一些校驗數據; 比如滾軸到凹槽的百分比值
ImageCaptchaValidatorimageCaptchaValidator=newBasicCaptchaTrackValidator();
// 這個map數據應該存到緩存中,校驗的時候需要用到該數據
Map<String,Object>map=imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo);
}
}
3. 使用
ImageCaptchaValidator
校驗器 驗證
packageexample.readme;
importcloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack;
importcloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator;
importjava.util.Map;
public classTest2{
publicstaticvoidmain(String[]args){
BasicCaptchaTrackValidatorsliderCaptchaValidator=newBasicCaptchaTrackValidator();
ImageCaptchaTrackimageCaptchaTrack=null;
Map<String,Object>map=null;
Floatpercentage=null;
// 使用者傳來的行為軌跡和進行校驗
// - imageCaptchaTrack為前端傳來的滑動軌跡數據
// - map 為生成驗證碼時緩存的map數據
booleancheck=sliderCaptchaValidator.valid(imageCaptchaTrack,map).isSuccess();
// // 如果只想校驗使用者是否滑到指定凹槽即可,也可以使用
// // - 參數1 使用者傳來的百分比數據
// // - 參數2 生成滾軸是真實的百分比數據
check=sliderCaptchaValidator.checkPercentage(0.2f,percentage);
}
}
整體架構設計
tianai-captcha 驗證碼整體分為 生成器(
ImageCaptchaGenerator
)、校驗器(
ImageCaptchaValidator
)、檔案總管(
ImageCaptchaResourceManager
) 其中生成器、校驗器、檔案總管等都是基於介面模式實作 可插拔的,可以替換為自訂實作,靈活度高
生成器(
ImageCaptchaGenerator
)
主要負責生成行為驗證碼所需的圖片
校驗器(
ImageCaptchaValidator
)
主要負責校驗使用者滑動的行為軌跡是否合規
檔案總管(
ImageCaptchaResourceManager
)
資源儲存(
ResourceStore
) 負責儲存背景圖和樣版圖
資源提供者(
ResourceProvider
) 負責將資源記憶體中對應的資源轉換為檔流
一般資源記憶體中儲存的是圖片的url地址或者id之類, 資源提供者 就是負責將url或者別的id轉換為真正的圖片檔
主要負責讀取驗證碼背景圖片和樣版圖片等
檔案總管細分為 資源儲存(
ResourceStore
)、資源提供者(
ResourceProvider
)
圖片轉換器 (
ImageTransform
)
主要負責將圖片檔流轉換成字串型別,可以是base64格式/url 或其它加密格式,預設實作是bas64格式;
擴充套件
生成帶有混淆滾軸的圖片
packageexample.readme;
importcloud.tianai.captcha.common.constant.CaptchaTypeConstant;
importcloud.tianai.captcha.generator.ImageCaptchaGenerator;
importcloud.tianai.captcha.generator.ImageTransform;
importcloud.tianai.captcha.generator.common.model.dto.GenerateParam;
importcloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
importcloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
importcloud.tianai.captcha.generator.impl.transform.Base64ImageTransform;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public classTest3{
publicstaticvoidmain(String[]args){
// 檔案總管
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
ImageTransformimageTransform=newBase64ImageTransform();
// 標準驗證碼生成器
ImageCaptchaGeneratorimageCaptchaGenerator=newMultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true);
// 生成 具有混淆的 滾軸驗證碼 (目前只有滾軸驗證碼支持混淆滾軸, 旋轉驗證,滑動還原,點選驗證 均不支持混淆功能)
ImageCaptchaInfoimageCaptchaInfo=imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder()
.type(CaptchaTypeConstant.SLIDER)
.sliderFormatName("png")
.backgroundFormatName("jpeg")
// 是否添加混淆滾軸
.obfuscate(true)
.build());
}
}
生成webp格式的滾軸圖片
packageexample.readme;
importcloud.tianai.captcha.common.constant.CaptchaTypeConstant;
importcloud.tianai.captcha.generator.ImageCaptchaGenerator;
importcloud.tianai.captcha.generator.common.model.dto.GenerateParam;
importcloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
importcloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public classTest4{
publicstaticvoidmain(String[]args){
// 檔案總管
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
ImageTransformimageTransform=newBase64ImageTransform();
// 標準驗證碼生成器
ImageCaptchaGeneratorimageCaptchaGenerator=newMultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true);
// 生成旋轉驗證碼 圖片型別為 webp
// 註意 tianai-captcha-1.3.2 後面預設刪除了生成webp格式圖片需要使用者自訂添加webp轉換的工具,需要使用者自訂添加和擴充套件
// 參考 https://bitbucket.org/luciad/webp-imageio
ImageCaptchaInfoslideImageInfo=imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder()
.type(CaptchaTypeConstant.ROTATE)
.sliderFormatName("webp")
.backgroundFormatName("webp")
.build());
System.out.println(slideImageInfo);
}
}
添加自訂圖片資源
自訂圖片資源大小為 590*360 格式為jpg
packageexample.readme;
importcloud.tianai.captcha.common.constant.CaptchaTypeConstant;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.ResourceStore;
importcloud.tianai.captcha.resource.common.model.dto.Resource;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.provider. classPathResourceProvider;
importcloud.tianai.captcha.resource.impl.provider.URLResourceProvider;
public classTest5{
publicstaticvoidmain(String[]args){
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
// 透過檔案總管或者資源記憶體
ResourceStoreresourceStore=imageCaptchaResourceManager.getResourceStore();
// 添加 classpath目錄下的 aa.jpg 圖片
resourceStore.addResource(CaptchaTypeConstant.SLIDER,newResource( classPathResourceProvider.NAME,"/aa.jpg"));
// 添加遠端url圖片資源
resourceStore.addResource(CaptchaTypeConstant.SLIDER,newResource(URLResourceProvider.NAME,"http://www.xx.com/aa.jpg"));
// 內建了透過url 和 classpath讀取圖片資源,如果想擴充套件可實作 ResourceProvider 介面,進行自訂擴充套件
}
}
添加自訂樣版資源
系統內建了2套樣版,可以到QQ群:1021884609 檔中獲取更多樣版或者自己制作樣版
樣版圖片格式
滾軸大小為 200*200 格式為png
凹槽大小為 200*200 格式為png
滾軸大小為 110*110 格式為png
凹槽大小為 110*110 格式為png
滾軸驗證碼
旋轉驗證碼
packageexample.readme;
importcloud.tianai.captcha.common.constant.CaptchaTypeConstant;
importcloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.ResourceStore;
importcloud.tianai.captcha.resource.common.model.dto.Resource;
importcloud.tianai.captcha.resource.common.model.dto.ResourceMap;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.provider. classPathResourceProvider;
public classTest6{
publicstaticvoidmain(String[]args){
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
// 透過檔案總管或者資源記憶體
ResourceStoreresourceStore=imageCaptchaResourceManager.getResourceStore();
// 添加滾軸驗證碼樣版.樣版圖片由三張圖片組成
ResourceMaptemplate1=newResourceMap("default",4);
template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME,newResource( classPathResourceProvider.NAME,"/active.png"));
template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME,newResource( classPathResourceProvider.NAME,"/fixed.png"));
resourceStore.addTemplate(CaptchaTypeConstant.SLIDER,template1);
// 樣版與三張圖片組成 滾軸、凹槽、背景圖
// 同樣預設支持 classpath 和 url 兩種獲取圖片資源, 如果想擴充套件可實作 ResourceProvider 介面,進行自訂擴充套件
}
}
清除內建的圖片資源和樣版資源
packageexample.readme;
importcloud.tianai.captcha.generator.ImageCaptchaGenerator;
importcloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public classTest6{
publicstaticvoidmain(String[]args){
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
ImageTransformimageTransform=newBase64ImageTransform();
//為方便快速上手 系統本身內建了一張圖片和兩套滾軸樣版,如果不想用系統內建的可以不讓它載入系統內建的
// 第二個構造參數設定為false時將不載入預設的圖片和樣版
ImageCaptchaGeneratorimageCaptchaGenerator=newMultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(false);
}
}
自訂
imageCaptchaValidator
校驗器
// 該介面負責對使用者滑動驗證碼後傳回的數據進行校驗,比如滾軸是否滑到指定位置,滾軸行為軌跡是否正常等等
// 該介面的預設實作有
// SimpleImageCaptchaValidator 校驗使用者是否滑到了指定缺口處
// BasicCaptchaTrackValidator 是對 SimpleImageCaptchaValidator增強
// BasicCaptchaTrackValidator是對SimpleImageCaptchaValidator的增強 對滑動軌跡進行了簡單的驗證
// 友情提示 因為BasicCaptchaTrackValidator 裏面校驗滑動軌跡的演算法已經開源,有強制要求的建議重寫該介面的方法,避免被破解
自訂
ResourceProvider
實作自訂檔讀取策略, 比如 oss之類的
packageexample.readme;
importcloud.tianai.captcha.generator.ImageCaptchaGenerator;
importcloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.ResourceProvider;
importcloud.tianai.captcha.resource.common.model.dto.Resource;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
importjava.io.InputStream;
public classTest7{
publicstaticvoidmain(String[]args){
// 自訂 ResourceProvider
ResourceProviderresourceProvider=newResourceProvider(){
@Override
publicInputStreamgetResourceInputStream(Resourcedata){
returnnull;
}
@Override
publicbooleansupported(Stringtype){
returnfalse;
}
@Override
publicStringgetName(){
returnnull;
}
};
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
ImageTransformimageTransform=newBase64ImageTransform();
ImageCaptchaGeneratorimageCaptchaGenerator=newMultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(false);
// 註冊
imageCaptchaResourceManager.registerResourceProvider(resourceProvider);
}
}
擴充套件,對
StandardImageCaptchaGenerator
增加了緩存模組
由於即時生成滾軸圖片可能會有一點效能影響,內部基於
StandardSliderCaptchaGenerator
進行了提前緩存生成好的圖片,
CacheSliderCaptchaGenerator
這只是基本的緩存邏輯,比較簡單,使用者可以定義一些更加有意思的擴充套件,用於突破效能瓶頸
packageexample.readme;
importcloud.tianai.captcha.common.constant.CaptchaTypeConstant;
importcloud.tianai.captcha.generator.ImageCaptchaGenerator;
importcloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
importcloud.tianai.captcha.generator.impl.CacheImageCaptchaGenerator;
importcloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
importcloud.tianai.captcha.resource.ImageCaptchaResourceManager;
importcloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public classTest8{
publicstaticvoidmain(String[]args)throwsInterruptedException{
// 使用 CacheSliderCaptchaGenerator 對滾軸驗證碼進行緩存,使其提前生成滾軸圖片
// 參數一: 真正實作 滾軸的 SliderCaptchaGenerator
// 參數二: 預設提前緩存多少個
// 參數三: 出錯後 等待xx時間再進行生成
// 參數四: 檢查時間間隔
ImageCaptchaResourceManagerimageCaptchaResourceManager=newDefaultImageCaptchaResourceManager();
ImageTransformimageTransform=newBase64ImageTransform();
ImageCaptchaGeneratorimageCaptchaGenerator=newCacheImageCaptchaGenerator(newMultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform),10,1000,100);
imageCaptchaGenerator.init(true);
// 生成滾軸圖片
ImageCaptchaInfoslideImageInfo=imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER);
// 獲取背景圖片的base64
StringbackgroundImage=slideImageInfo.getBackgroundImage();
// 獲取滾軸圖片
StringsliderImage=slideImageInfo.getSliderImage();
System.out.println(slideImageInfo);
}
}
檢視相關程式碼和演示地址,請關註微信公眾號,回復數位1,謝謝你的關註