當前位置: 妍妍網 > 碼農

可能是開源界最好用的行為驗證碼工具

2024-03-16碼農

簡單介紹

  • 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,謝謝你的關註