From afbb88c67d07affb4e4718d95d280a8f978f6bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E7=88=B1=E6=9C=89=E6=83=85?= Date: Sat, 7 May 2022 11:14:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image/3.png | Bin 108878 -> 0 bytes image/6.png | Bin 60136 -> 37317 bytes pom.xml | 4 +- readme.md | 172 ++++++++++++------ .../common/constant/CaptchaTypeConstant.java | 2 +- .../exception/ImageCaptchaException.java | 2 +- .../slider => }/common/util/CaptchaUtils.java | 5 +- .../common/util/CollectionUtils.java | 2 +- .../slider => }/common/util/FontUtils.java | 2 +- .../common/util/NamedThreadFactory.java | 2 +- .../slider => }/common/util/ObjectUtils.java | 2 +- .../AbstractImageCaptchaGenerator.java | 8 +- .../generator/ImageCaptchaGenerator.java | 11 +- .../constant/SliderCaptchaConstant.java | 2 +- .../model/dto/ClickImageCheckDefinition.java | 2 +- .../common/model/dto/GenerateParam.java | 5 +- .../common/model/dto/ImageCaptchaInfo.java | 2 +- .../model/dto/RotateImageCaptchaInfo.java | 5 +- .../model/dto/SliderImageCaptchaInfo.java | 5 +- .../common/util/CaptchaImageUtils.java | 2 +- .../AbstractClickImageCaptchaGenerator.java | 20 +- .../impl/CacheImageCaptchaGenerator.java | 13 +- .../impl/MultiImageCaptchaGenerator.java | 16 +- .../StandardConcatImageCaptchaGenerator.java | 22 +-- ...dRandomWordClickImageCaptchaGenerator.java | 30 +-- .../StandardRotateImageCaptchaGenerator.java | 65 ++++--- .../StandardSliderImageCaptchaGenerator.java | 46 ++--- .../resource/AbstractResourceProvider.java | 4 +- .../resource/ImageCaptchaResourceManager.java | 4 +- .../resource/ResourceProvider.java | 5 +- .../slider => }/resource/ResourceStore.java | 5 +- .../resource/common/model/dto/Resource.java | 4 +- .../DefaultImageCaptchaResourceManager.java | 18 +- .../resource/impl/DefaultResourceStore.java | 10 +- .../provider/ClassPathResourceProvider.java | 8 +- .../impl/provider/FileResourceProvider.java | 8 +- .../impl/provider/URLResourceProvider.java | 7 +- .../validator/ImageCaptchaValidator.java | 8 +- .../common/constant/TrackTypeConstant.java | 2 +- .../common/model/dto/ImageCaptchaTrack.java | 5 +- .../impl/BasicCaptchaTrackValidator.java | 14 +- .../impl/SimpleImageCaptchaValidator.java | 31 ++-- .../test/java/example/DrawCaptchaUtil.java | 4 +- .../StandardConcatCaptchaGeneratorTest.java | 20 +- .../StandardRotateCaptchaGeneratorTest.java | 18 +- ...ardWordClickImageCaptchaGeneratorTest.java | 14 +- 46 files changed, 376 insertions(+), 260 deletions(-) delete mode 100644 image/3.png rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/constant/CaptchaTypeConstant.java (87%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/exception/ImageCaptchaException.java (91%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/util/CaptchaUtils.java (81%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/util/CollectionUtils.java (99%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/util/FontUtils.java (92%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/util/NamedThreadFactory.java (95%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/common/util/ObjectUtils.java (99%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/AbstractImageCaptchaGenerator.java (88%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/ImageCaptchaGenerator.java (72%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/constant/SliderCaptchaConstant.java (85%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/model/dto/ClickImageCheckDefinition.java (86%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/model/dto/GenerateParam.java (72%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/model/dto/ImageCaptchaInfo.java (97%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/model/dto/RotateImageCaptchaInfo.java (90%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/model/dto/SliderImageCaptchaInfo.java (89%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/common/util/CaptchaImageUtils.java (99%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/AbstractClickImageCaptchaGenerator.java (86%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/CacheImageCaptchaGenerator.java (93%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/MultiImageCaptchaGenerator.java (80%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/StandardConcatImageCaptchaGenerator.java (79%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java (80%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/StandardRotateImageCaptchaGenerator.java (58%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/generator/impl/StandardSliderImageCaptchaGenerator.java (79%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/AbstractResourceProvider.java (85%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/ImageCaptchaResourceManager.java (91%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/ResourceProvider.java (76%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/ResourceStore.java (92%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/common/model/dto/Resource.java (69%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/impl/DefaultImageCaptchaResourceManager.java (83%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/impl/DefaultResourceStore.java (90%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/impl/provider/ClassPathResourceProvider.java (75%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/impl/provider/FileResourceProvider.java (69%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/resource/impl/provider/URLResourceProvider.java (72%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/validator/ImageCaptchaValidator.java (82%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/validator/common/constant/TrackTypeConstant.java (81%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/validator/common/model/dto/ImageCaptchaTrack.java (83%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/validator/impl/BasicCaptchaTrackValidator.java (90%) rename src/main/java/cloud/tianai/captcha/{template/slider => }/validator/impl/SimpleImageCaptchaValidator.java (90%) diff --git a/image/3.png b/image/3.png deleted file mode 100644 index f49d3b8f338332d9dc24b6b3c1dc408608a8c398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108878 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

<-Jk*{5G-sT?ek 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 Cf+U6j literal 60136 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.0.0 cloud.tianai.captcha tianai-captcha - 1.3.1.alpha + 1.3.1 tianai-captcha - 滑块验证码 + 行为验证码 https://gitee.com/tianai/tianai-captcha diff --git a/readme.md b/readme.md index da57e90..5b171c4 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -这是一个滑块验证码的实现 +这是一个行为验证码的实现 ## [在线体验](https://www.tianai.cloud) @@ -6,18 +6,27 @@ ![](image/1.png) ![](image/2.png) -![](image/3.png) ![](image/4.png) ![](image/5.png) ![](image/6.png) +![](image/7.png) +![](image/9.png) +![](image/10.png) +![](image/11.png) +![](image/12.png) -- 该滑块验证码实现了 普通图片和 **webp**图片两种格式 -- java获取滑块验证码例子 +## 简单介绍 +- tianai-captcha 目前支持的行为验证码类型 + - 滑块验证码 + - 旋转验证码 + - 滑动还原验证码 + - 文字点选验证码 + - 后面会陆续支持市面上更多好玩的验证码玩法... 敬请期待 + +- 该滑块验证码实现了 普通图片和 **webp**(拷贝github大神开源的webp图片生成代码)图片两种格式 ## 快速上手 -- - 如果是SpringBoot开发者可直接使用SpringBoot快速启动器[tianai-captcha-springboot-starter](https://gitee.com/tianai/tianai-captcha-springboot-starter) ### 1. 导入xml @@ -27,47 +36,59 @@ cloud.tianai.captcha tianai-captcha - 1.3.0.RELEASE + 1.3.1 ``` -### 2. 使用 `SliderCaptchaGenerator`生成器生成滑块验证码 +### 2. 使用 `ImageCaptchaGenerator`生成器生成验证码 ```java -import cloud.tianai.captcha.template.slider.generator.impl.StandardSliderImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.impl.StandardSliderCaptchaGenerator; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.impl.DefaultImageCaptchaResourceManager; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.StandardSliderCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; public class Test { public static void main(String[] args) throws InterruptedException { ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - StandardSliderImageCaptchaGenerator sliderCaptchaGenerator = new StandardSliderImageCaptchaGenerator(imageCaptchaResourceManager, true); - // 生成滑块图片 - SliderCaptchaInfo slideImageInfo = sliderCaptchaGenerator.generateCaptchaImage(); - System.out.println(slideImageInfo); + MultiImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + /* + 生成滑块验证码图片, 可选项 + SLIDER (滑块验证码) + ROTATE (旋转验证码) + CONCAT (滑动还原验证码) + WORD_IMAGE_CLICK (文字点选验证码) + + 更多验证码支持 详见 cloud.tianai.captcha.common.constant.CaptchaTypeConstant + */ + ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); + System.out.println(imageCaptchaInfo); // 负责计算一些数据存到缓存中,用于校验使用 - // SliderCaptchaValidator负责校验用户滑动滑块是否正确和生成滑块的一些校验数据; 比如滑块到凹槽的百分比值 - SliderCaptchaValidator sliderCaptchaValidator = new BasicCaptchaTrackValidator(); + // ImageCaptchaValidator负责校验用户滑动滑块是否正确和生成滑块的一些校验数据; 比如滑块到凹槽的百分比值 + ImageCaptchaValidator imageCaptchaValidator = new BasicCaptchaTrackValidator(); // 这个map数据应该存到缓存中,校验的时候需要用到该数据 - Map map = sliderCaptchaValidator.generateSliderCaptchaValidData(slideImageInfo); + Map map = imageCaptchaValidator.generateSliderCaptchaValidData(imageCaptchaInfo); } } ``` -### 3. 使用`SliderCaptchaValidator`校验器 验证 +### 3. 使用`ImageCaptchaGenerator`校验器 验证 ```java -import cloud.tianai.captcha.template.slider.generator.ImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.SliderCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.SliderCaptchaGenerator; +import cloud.tianai.captcha.validator.ImageCaptchaValidator; public class Test2 { public static void main(String[] args) { - ImageCaptchaGenerator sliderCaptchaValidator = new BasicCaptchaTrackValidator(); + ImageCaptchaValidator sliderCaptchaValidator = new BasicCaptchaTrackValidator(); // 用户传来的行为轨迹和进行校验 - // - sliderCaptchaTrack为前端传来的滑动轨迹数据 + // - imageCaptchaTrack为前端传来的滑动轨迹数据 // - map 为生成验证码时缓存的map数据 boolean check = sliderCaptchaValidator.valid(imageCaptchaTrack, map); // 如果只想校验用户是否滑到指定凹槽即可,也可以使用 @@ -80,14 +101,14 @@ public class Test2 { ## 整体架构设计 -> tianai-captcha 验证码整体分为 生成器(`SliderCaptchaGenerator`)、校验器(`SliderCaptchaValidato`r)、资源管理器(`SliderCaptchaResourceManager`) +> tianai-captcha 验证码整体分为 生成器(`ImageCaptchaGenerator`)、校验器(`ImageCaptchaValidator`)、资源管理器(`ImageCaptchaResourceManager`) > 其中生成器、校验器、资源管理器等都是基于接口模式实现 可插拔的,可以替换为自定义实现,灵活度高 -- 生成器(`SliderCaptchaGenerator`) +- 生成器(`ImageCaptchaGenerator`) - 主要负责生成滑块验证码所需的图片 -- 校验器(`SliderCaptchaValidator`) +- 校验器(`ImageCaptchaValidator`) - 主要负责校验用户滑动的行为轨迹是否合规 -- 资源管理器(`SliderCaptchaResourceManager`) +- 资源管理器(`ImageCaptchaResourceManager`) - 主要负责读取验证码背景图片和模板图片等 - 资源管理器细分为 资源存储(`ResourceStore`)、资源提供者(`ResourceProvider`) - 资源存储(`ResourceStore`) 负责存储背景图和模板图 @@ -95,17 +116,26 @@ public class Test2 { - 一般资源存储器中存储的是图片的url地址或者id之类, 资源提供者 就是负责将url或者别的id转换为真正的图片文件 ## 扩展 + ### 生成带有混淆滑块的图片 ```java +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + public class Test { public static void main(String[] args) { // 资源管理器 - SliderCaptchaResourceManager imageCaptchaResourceManager = new DefaultSliderCaptchaResourceManager(); + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 标准验证码生成器 - StandardSliderCaptchaGenerator sliderCaptchaGenerator = new StandardSliderCaptchaGenerator(imageCaptchaResourceManager, true); - // 生成滑块图片 - SliderCaptchaInfo slideImageInfo = sliderCaptchaGenerator.generateSlideImageInfo(GenerateParam.builder() + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + // 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能) + ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() + .type(CaptchaTypeConstant.SLIDER) .sliderFormatName("jpeg") .backgroundFormatName("png") // 是否添加混淆滑块 @@ -118,18 +148,23 @@ public class Test { ### 生成webp格式的滑块图片 ```java +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + public class Test { public static void main(String[] args) { // 资源管理器 - SliderCaptchaResourceManager imageCaptchaResourceManager = new DefaultSliderCaptchaResourceManager(); + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 标准验证码生成器 - StandardSliderCaptchaGenerator sliderCaptchaGenerator = new StandardSliderCaptchaGenerator(imageCaptchaResourceManager, true); - // 生成滑块图片 + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + // 生成旋转验证码 图片类型为 webp SliderCaptchaInfo slideImageInfo = sliderCaptchaGenerator.generateSlideImageInfo(GenerateParam.builder() + .type(CaptchaTypeConstant.ROTATE) .sliderFormatName("webp") .backgroundFormatName("webp") - // 是否添加混淆滑块 - .obfuscate(false) .build()); } } @@ -140,8 +175,16 @@ public class Test { - 自定义图片资源大小为 590*360 格式为jpg ```java - public class Test { + import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider; + +public class Test { public static void main(String[] args) { + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 通过资源管理器或者资源存储器 ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); // 添加classpath目录下的 aa.jpg 图片 @@ -162,11 +205,17 @@ public class Test { - 模板大小为 110*360 格式为png,该图为固定格式,是一张纯透明图片 ```java - public class Test { +import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + +public class Test { public static void main(String[] args) { + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 通过资源管理器或者资源存储器 ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); - // 添加模板.模板图片由三张图片组成 + // 添加滑块验证码模板.模板图片由三张图片组成 Map template1 = new HashMap<>(4); template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, "/active.png")); template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, "/fixed.png")); @@ -181,45 +230,61 @@ public class Test { - 清除内置的图片资源和模板资源 ```java +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; + public class Test { public static void main(String[] args) { //为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的 // 第二个构造参数设置为false时将不加载默认的图片和模板 - SliderCaptchaGenerator sliderCaptchaGenerator = new StandardSliderCaptchaGenerator(imageCaptchaResourceManager, false); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, false); } } ``` -### 自定义 `SliderCaptchaValidator` 校验器 +### 自定义 `imageCaptchaValidator` 校验器 ```java // 该接口负责对用户滑动验证码后传回的数据进行校验,比如滑块是否滑到指定位置,滑块行为轨迹是否正常等等 // 该接口的默认实现有 -// SimpleSliderCaptchaValidator 校验用户是否滑到了指定缺口处 -// BasicCaptchaTrackValidator 是对 SimpleSliderCaptchaValidator增强 -// BasicCaptchaTrackValidator是对SimpleSliderCaptchaValidator的增强 对滑动轨迹进行了简单的验证 +// SimpleImageCaptchaValidator 校验用户是否滑到了指定缺口处 +// BasicCaptchaTrackValidator 是对 SimpleImageCaptchaValidator增强 +// BasicCaptchaTrackValidator是对SimpleImageCaptchaValidator的增强 对滑动轨迹进行了简单的验证 // 友情提示 因为BasicCaptchaTrackValidator 里面校验滑动轨迹的算法已经开源,有强制要求的建议重写该接口的方法,避免被破解 ``` ### 自定义 `ResourceProvider` 实现自定义文件读取策略, 比如 oss之类的 ```java - public class Test { + import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + +public class Test { public static void main(String[] args) { // 实现了 ResourceProvider 后 - SliderCaptchaResourceManager imageCaptchaResourceManager = new DefaultSliderCaptchaResourceManager(); - StandardSliderCaptchaGenerator sliderCaptchaGenerator = new StandardSliderCaptchaGenerator(imageCaptchaResourceManager, true); + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); // 注册 imageCaptchaResourceManager.registerResourceProvider(new CustomResourceProvider()); } } ``` -### 扩展,对`StandardSliderCaptchaGenerator`增加了缓存模块 +### 扩展,对`StandardImageCaptchaGenerator`增加了缓存模块 > 由于实时生成滑块图片可能会有一点性能影响,内部基于`StandardSliderCaptchaGenerator`进行了提前缓存生成好的图片,`CacheSliderCaptchaGenerator` 这只是基本的缓存逻辑,比较简单,用户可以定义一些更加有意思的扩展,用于突破性能瓶颈 ```java +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.impl.CacheImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + public class Test { public static void main(String[] args) throws InterruptedException { // 使用 CacheSliderCaptchaGenerator 对滑块验证码进行缓存,使其提前生成滑块图片 @@ -227,17 +292,16 @@ public class Test { // 参数二: 默认提前缓存多少个 // 参数三: 出错后 等待xx时间再进行生成 // 参数四: 检查时间间隔 - SliderCaptchaResourceManager imageCaptchaResourceManager = new DefaultSliderCaptchaResourceManager(); - SliderCaptchaGenerator sliderCaptchaGenerator = new CacheSliderCaptchaGenerator(new StandardSliderCaptchaGenerator(imageCaptchaResourceManager, true), 10, 1000, 100); + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true), 10, 1000, 100); // 生成滑块图片 - SliderCaptchaInfo slideImageInfo = sliderCaptchaGenerator.generateSlideImageInfo(); + ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); // 获取背景图片的base64 String backgroundImage = slideImageInfo.getBackgroundImage(); // 获取滑块图片 - slideImageInfo.getSliderImage(); + String sliderImage = slideImageInfo.getSliderImage(); System.out.println(slideImageInfo); } } ``` - # qq群: 1021884609 \ No newline at end of file diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/constant/CaptchaTypeConstant.java b/src/main/java/cloud/tianai/captcha/common/constant/CaptchaTypeConstant.java similarity index 87% rename from src/main/java/cloud/tianai/captcha/template/slider/common/constant/CaptchaTypeConstant.java rename to src/main/java/cloud/tianai/captcha/common/constant/CaptchaTypeConstant.java index 1e585d0..b2f183a 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/constant/CaptchaTypeConstant.java +++ b/src/main/java/cloud/tianai/captcha/common/constant/CaptchaTypeConstant.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.common.constant; +package cloud.tianai.captcha.common.constant; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/exception/ImageCaptchaException.java b/src/main/java/cloud/tianai/captcha/common/exception/ImageCaptchaException.java similarity index 91% rename from src/main/java/cloud/tianai/captcha/template/slider/common/exception/ImageCaptchaException.java rename to src/main/java/cloud/tianai/captcha/common/exception/ImageCaptchaException.java index 229b42a..db7ab78 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/exception/ImageCaptchaException.java +++ b/src/main/java/cloud/tianai/captcha/common/exception/ImageCaptchaException.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.common.exception; +package cloud.tianai.captcha.common.exception; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/util/CaptchaUtils.java b/src/main/java/cloud/tianai/captcha/common/util/CaptchaUtils.java similarity index 81% rename from src/main/java/cloud/tianai/captcha/template/slider/common/util/CaptchaUtils.java rename to src/main/java/cloud/tianai/captcha/common/util/CaptchaUtils.java index d44bad2..5320f63 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/util/CaptchaUtils.java +++ b/src/main/java/cloud/tianai/captcha/common/util/CaptchaUtils.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.common.util; +package cloud.tianai.captcha.common.util; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/util/CollectionUtils.java b/src/main/java/cloud/tianai/captcha/common/util/CollectionUtils.java similarity index 99% rename from src/main/java/cloud/tianai/captcha/template/slider/common/util/CollectionUtils.java rename to src/main/java/cloud/tianai/captcha/common/util/CollectionUtils.java index 58feb38..f76b651 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/util/CollectionUtils.java +++ b/src/main/java/cloud/tianai/captcha/common/util/CollectionUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package cloud.tianai.captcha.template.slider.common.util; +package cloud.tianai.captcha.common.util; import java.util.*; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/util/FontUtils.java b/src/main/java/cloud/tianai/captcha/common/util/FontUtils.java similarity index 92% rename from src/main/java/cloud/tianai/captcha/template/slider/common/util/FontUtils.java rename to src/main/java/cloud/tianai/captcha/common/util/FontUtils.java index 4e8db8e..14955c7 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/util/FontUtils.java +++ b/src/main/java/cloud/tianai/captcha/common/util/FontUtils.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.common.util; +package cloud.tianai.captcha.common.util; import lombok.SneakyThrows; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/util/NamedThreadFactory.java b/src/main/java/cloud/tianai/captcha/common/util/NamedThreadFactory.java similarity index 95% rename from src/main/java/cloud/tianai/captcha/template/slider/common/util/NamedThreadFactory.java rename to src/main/java/cloud/tianai/captcha/common/util/NamedThreadFactory.java index b5f3d8a..79829fe 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/util/NamedThreadFactory.java +++ b/src/main/java/cloud/tianai/captcha/common/util/NamedThreadFactory.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.common.util; +package cloud.tianai.captcha.common.util; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/common/util/ObjectUtils.java b/src/main/java/cloud/tianai/captcha/common/util/ObjectUtils.java similarity index 99% rename from src/main/java/cloud/tianai/captcha/template/slider/common/util/ObjectUtils.java rename to src/main/java/cloud/tianai/captcha/common/util/ObjectUtils.java index ed5b257..de57396 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/common/util/ObjectUtils.java +++ b/src/main/java/cloud/tianai/captcha/common/util/ObjectUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package cloud.tianai.captcha.template.slider.common.util; +package cloud.tianai.captcha.common.util; import java.lang.reflect.Array; import java.util.Arrays; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/AbstractImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java similarity index 88% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/AbstractImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java index 4c91ade..f9732cc 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/AbstractImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/AbstractImageCaptchaGenerator.java @@ -1,8 +1,8 @@ -package cloud.tianai.captcha.template.slider.generator; +package cloud.tianai.captcha.generator; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/ImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java similarity index 72% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/ImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java index b8ee7ea..64d7002 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/ImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/ImageCaptchaGenerator.java @@ -1,9 +1,10 @@ -package cloud.tianai.captcha.template.slider.generator; +package cloud.tianai.captcha.generator; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/constant/SliderCaptchaConstant.java b/src/main/java/cloud/tianai/captcha/generator/common/constant/SliderCaptchaConstant.java similarity index 85% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/constant/SliderCaptchaConstant.java rename to src/main/java/cloud/tianai/captcha/generator/common/constant/SliderCaptchaConstant.java index 35a6539..246a78c 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/constant/SliderCaptchaConstant.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/constant/SliderCaptchaConstant.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.generator.common.constant; +package cloud.tianai.captcha.generator.common.constant; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/ClickImageCheckDefinition.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java similarity index 86% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/ClickImageCheckDefinition.java rename to src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java index f38e856..8679266 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/ClickImageCheckDefinition.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ClickImageCheckDefinition.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.generator.common.model.dto; +package cloud.tianai.captcha.generator.common.model.dto; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/GenerateParam.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/GenerateParam.java similarity index 72% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/GenerateParam.java rename to src/main/java/cloud/tianai/captcha/generator/common/model/dto/GenerateParam.java index 8b1b4f0..de44c50 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/GenerateParam.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/GenerateParam.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.generator.common.model.dto; +package cloud.tianai.captcha.generator.common.model.dto; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import lombok.*; /** diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/ImageCaptchaInfo.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ImageCaptchaInfo.java similarity index 97% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/ImageCaptchaInfo.java rename to src/main/java/cloud/tianai/captcha/generator/common/model/dto/ImageCaptchaInfo.java index 80284a9..e2590a3 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/ImageCaptchaInfo.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/ImageCaptchaInfo.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.generator.common.model.dto; +package cloud.tianai.captcha.generator.common.model.dto; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/RotateImageCaptchaInfo.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/RotateImageCaptchaInfo.java similarity index 90% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/RotateImageCaptchaInfo.java rename to src/main/java/cloud/tianai/captcha/generator/common/model/dto/RotateImageCaptchaInfo.java index 8a8a9ad..a1f7abe 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/RotateImageCaptchaInfo.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/RotateImageCaptchaInfo.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.generator.common.model.dto; +package cloud.tianai.captcha.generator.common.model.dto; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/SliderImageCaptchaInfo.java b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/SliderImageCaptchaInfo.java similarity index 89% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/SliderImageCaptchaInfo.java rename to src/main/java/cloud/tianai/captcha/generator/common/model/dto/SliderImageCaptchaInfo.java index 35021bf..8ece69f 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/model/dto/SliderImageCaptchaInfo.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/model/dto/SliderImageCaptchaInfo.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.generator.common.model.dto; +package cloud.tianai.captcha.generator.common.model.dto; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/util/CaptchaImageUtils.java b/src/main/java/cloud/tianai/captcha/generator/common/util/CaptchaImageUtils.java similarity index 99% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/common/util/CaptchaImageUtils.java rename to src/main/java/cloud/tianai/captcha/generator/common/util/CaptchaImageUtils.java index 91d5ee8..b83dfad 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/common/util/CaptchaImageUtils.java +++ b/src/main/java/cloud/tianai/captcha/generator/common/util/CaptchaImageUtils.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.generator.common.util; +package cloud.tianai.captcha.generator.common.util; import lombok.SneakyThrows; import sun.font.FontDesignMetrics; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/AbstractClickImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java similarity index 86% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/AbstractClickImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java index 3726096..ec0ae64 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/AbstractClickImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/AbstractClickImageCaptchaGenerator.java @@ -1,11 +1,13 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.generator.AbstractImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ClickImageCheckDefinition; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.common.util.CaptchaImageUtils; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import lombok.*; import java.awt.image.BufferedImage; @@ -14,7 +16,7 @@ import java.io.InputStream; import java.util.*; import java.util.concurrent.ThreadLocalRandom; -import static cloud.tianai.captcha.template.slider.generator.common.util.CaptchaImageUtils.wrapFile2BufferedImage; +import static cloud.tianai.captcha.generator.common.util.CaptchaImageUtils.wrapFile2BufferedImage; /** * @Author: 天爱有情 @@ -41,7 +43,7 @@ public abstract class AbstractClickImageCaptchaGenerator extends AbstractImageCa Resource resourceImage = getImageResourceManager().randomGetResource(param.getType()); InputStream resourceInputStream = getImageResourceManager().getResourceInputStream(resourceImage); inputStreams.add(resourceInputStream); - BufferedImage bgImage = wrapFile2BufferedImage(resourceInputStream); + BufferedImage bgImage = CaptchaImageUtils.wrapFile2BufferedImage(resourceInputStream); List clickImageCheckDefinitionList = new ArrayList<>(interferenceCount); int allImages = interferenceCount + checkClickCount; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/CacheImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java similarity index 93% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/CacheImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java index 804d398..060f420 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/CacheImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/CacheImageCaptchaGenerator.java @@ -1,10 +1,11 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.common.util.NamedThreadFactory; -import cloud.tianai.captcha.template.slider.generator.ImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.common.util.NamedThreadFactory; +import cloud.tianai.captcha.common.util.NamedThreadFactory; +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/MultiImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java similarity index 80% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/MultiImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java index 183f6a6..9d5be8a 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/MultiImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/MultiImageCaptchaGenerator.java @@ -1,12 +1,12 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.common.util.ObjectUtils; -import cloud.tianai.captcha.template.slider.generator.AbstractImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.ImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.util.ObjectUtils; +import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardConcatImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java similarity index 79% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardConcatImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java index a263dde..6cbbad7 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardConcatImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardConcatImageCaptchaGenerator.java @@ -1,13 +1,13 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.AbstractImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; -import cloud.tianai.captcha.template.slider.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; import lombok.SneakyThrows; import java.awt.image.BufferedImage; @@ -17,8 +17,8 @@ import java.util.Collection; import java.util.LinkedList; import java.util.concurrent.ThreadLocalRandom; -import static cloud.tianai.captcha.template.slider.generator.common.util.CaptchaImageUtils.*; -import static cloud.tianai.captcha.template.slider.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH; +import static cloud.tianai.captcha.generator.common.util.CaptchaImageUtils.*; +import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java similarity index 80% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java index c7ca520..6b03b8f 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRandomWordClickImageCaptchaGenerator.java @@ -1,15 +1,19 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.common.util.FontUtils; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ClickImageCheckDefinition; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.common.util.CaptchaImageUtils; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; -import cloud.tianai.captcha.template.slider.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.util.FontUtils; +import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.util.FontUtils; +import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; import lombok.Data; import lombok.SneakyThrows; import sun.font.FontDesignMetrics; @@ -21,7 +25,7 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; -import static cloud.tianai.captcha.template.slider.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH; +import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH; /** * @Author: 天爱有情 @@ -73,7 +77,7 @@ public class StandardRandomWordClickImageCaptchaGenerator extends AbstractClickI public void initDefaultResource() { ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); // 添加一些系统的资源文件 - resourceStore.addResource(CaptchaTypeConstant.WORD_IMAGE_CLICK, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_RESOURCE_PATH.concat("/1.jpg"))); + resourceStore.addResource(CaptchaTypeConstant.WORD_IMAGE_CLICK, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH.concat("/1.jpg"))); } @Override diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardRotateImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java similarity index 58% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardRotateImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java index 3705457..8ac573d 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardRotateImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardRotateImageCaptchaGenerator.java @@ -1,15 +1,26 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.AbstractImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.common.constant.SliderCaptchaConstant; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.RotateImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; -import cloud.tianai.captcha.template.slider.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.model.dto.RotateImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.model.dto.RotateImageCaptchaInfo; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; import lombok.SneakyThrows; import java.awt.image.BufferedImage; @@ -21,9 +32,9 @@ import java.util.LinkedList; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; -import static cloud.tianai.captcha.template.slider.generator.common.util.CaptchaImageUtils.*; -import static cloud.tianai.captcha.template.slider.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH; -import static cloud.tianai.captcha.template.slider.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH; +import static cloud.tianai.captcha.generator.common.util.CaptchaImageUtils.*; +import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH; +import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH; /** * @Author: 天爱有情 @@ -44,13 +55,13 @@ public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGen public void initDefaultResource() { ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); // 添加一些系统的资源文件 - resourceStore.addResource(CaptchaTypeConstant.ROTATE, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_RESOURCE_PATH.concat("/1.jpg"))); + resourceStore.addResource(CaptchaTypeConstant.ROTATE, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_RESOURCE_PATH.concat("/1.jpg"))); // 添加一些系统的 模板文件 Map template1 = new HashMap<>(4); - template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/active.png"))); - template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/fixed.png"))); - template1.put(SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/matrix.png"))); + template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/active.png"))); + template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/fixed.png"))); + template1.put(SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/3/matrix.png"))); resourceStore.addTemplate(CaptchaTypeConstant.ROTATE, template1); } @@ -66,34 +77,34 @@ public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGen Resource resourceImage = imageCaptchaResourceManager.randomGetResource(param.getType()); InputStream resourceInputStream = imageCaptchaResourceManager.getResourceInputStream(resourceImage); inputStreams.add(resourceInputStream); - BufferedImage cutBackground = wrapFile2BufferedImage(resourceInputStream); + BufferedImage cutBackground = CaptchaImageUtils.wrapFile2BufferedImage(resourceInputStream); // 拷贝一份图片 - BufferedImage targetBackground = deepCopyBufferedImage(cutBackground); + BufferedImage targetBackground = CaptchaImageUtils.deepCopyBufferedImage(cutBackground); InputStream fixedTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME); inputStreams.add(fixedTemplateInput); - BufferedImage fixedTemplate = wrapFile2BufferedImage(fixedTemplateInput); + BufferedImage fixedTemplate = CaptchaImageUtils.wrapFile2BufferedImage(fixedTemplateInput); InputStream activeTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME); inputStreams.add(activeTemplateInput); - BufferedImage activeTemplate = wrapFile2BufferedImage(activeTemplateInput); + BufferedImage activeTemplate = CaptchaImageUtils.wrapFile2BufferedImage(activeTemplateInput); InputStream matrixTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME); inputStreams.add(matrixTemplateInput); - BufferedImage matrixTemplate = wrapFile2BufferedImage(matrixTemplateInput); + BufferedImage matrixTemplate = CaptchaImageUtils.wrapFile2BufferedImage(matrixTemplateInput); // 算出居中的x和y int x = targetBackground.getWidth() / 2 - fixedTemplate.getWidth() / 2; int y = targetBackground.getHeight() / 2 - fixedTemplate.getHeight() / 2; - overlayImage(targetBackground, fixedTemplate, x, y); + CaptchaImageUtils.overlayImage(targetBackground, fixedTemplate, x, y); // 抠图部分 - BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, x, y); - overlayImage(cutImage, activeTemplate, 0, 0); + BufferedImage cutImage = CaptchaImageUtils.cutImage(cutBackground, fixedTemplate, x, y); + CaptchaImageUtils.overlayImage(cutImage, activeTemplate, 0, 0); // 随机旋转抠图部分 // 随机x, 转换为角度 int randomX = ThreadLocalRandom.current().nextInt(fixedTemplate.getWidth() + 10, targetBackground.getWidth() - 10); double degree = 360d - randomX / ((targetBackground.getWidth()) / 360d); - centerOverlayAndRotateImage(matrixTemplate, cutImage, degree); + CaptchaImageUtils.centerOverlayAndRotateImage(matrixTemplate, cutImage, degree); return wrapRotateCaptchaInfo(degree, randomX, targetBackground, matrixTemplate, param); } finally { // 使用完后关闭流 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardSliderImageCaptchaGenerator.java b/src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java similarity index 79% rename from src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardSliderImageCaptchaGenerator.java rename to src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java index 613dcdc..e4e990d 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/generator/impl/StandardSliderImageCaptchaGenerator.java +++ b/src/main/java/cloud/tianai/captcha/generator/impl/StandardSliderImageCaptchaGenerator.java @@ -1,15 +1,17 @@ -package cloud.tianai.captcha.template.slider.generator.impl; +package cloud.tianai.captcha.generator.impl; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.AbstractImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.common.constant.SliderCaptchaConstant; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.SliderImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; -import cloud.tianai.captcha.template.slider.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator; +import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.model.dto.SliderImageCaptchaInfo; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -22,7 +24,7 @@ import java.util.LinkedList; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; -import static cloud.tianai.captcha.template.slider.generator.common.util.CaptchaImageUtils.*; +import static cloud.tianai.captcha.generator.common.util.CaptchaImageUtils.*; /** * @Author: 天爱有情 @@ -65,22 +67,22 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen Resource resourceImage = imageCaptchaResourceManager.randomGetResource(param.getType()); InputStream resourceInputStream = imageCaptchaResourceManager.getResourceInputStream(resourceImage); inputStreams.add(resourceInputStream); - BufferedImage cutBackground = wrapFile2BufferedImage(resourceInputStream); + BufferedImage cutBackground = CaptchaImageUtils.wrapFile2BufferedImage(resourceInputStream); // 拷贝一份图片 - BufferedImage targetBackground = deepCopyBufferedImage(cutBackground); + BufferedImage targetBackground = CaptchaImageUtils.deepCopyBufferedImage(cutBackground); InputStream fixedTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME); inputStreams.add(fixedTemplateInput); - BufferedImage fixedTemplate = wrapFile2BufferedImage(fixedTemplateInput); + BufferedImage fixedTemplate = CaptchaImageUtils.wrapFile2BufferedImage(fixedTemplateInput); InputStream activeTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME); inputStreams.add(activeTemplateInput); - BufferedImage activeTemplate = wrapFile2BufferedImage(activeTemplateInput); + BufferedImage activeTemplate = CaptchaImageUtils.wrapFile2BufferedImage(activeTemplateInput); InputStream matrixTemplateInput = getTemplateFile(templateImages, SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME); inputStreams.add(matrixTemplateInput); - BufferedImage matrixTemplate = wrapFile2BufferedImage(matrixTemplateInput); + BufferedImage matrixTemplate = CaptchaImageUtils.wrapFile2BufferedImage(matrixTemplateInput); // BufferedImage cutTemplate = warpFile2BufferedImage(getTemplateFile(templateImages, CUT_IMAGE_NAME)); @@ -88,15 +90,15 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen int randomX = ThreadLocalRandom.current().nextInt(fixedTemplate.getWidth() + 5, targetBackground.getWidth() - fixedTemplate.getWidth() - 10); int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight()); - overlayImage(targetBackground, fixedTemplate, randomX, randomY); + CaptchaImageUtils.overlayImage(targetBackground, fixedTemplate, randomX, randomY); if (obfuscate) { // 加入混淆滑块 int obfuscateX = randomObfuscateX(randomX, fixedTemplate.getWidth(), targetBackground.getWidth()); - overlayImage(targetBackground, fixedTemplate, obfuscateX, randomY); + CaptchaImageUtils.overlayImage(targetBackground, fixedTemplate, obfuscateX, randomY); } - BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY); - overlayImage(cutImage, activeTemplate, 0, 0); - overlayImage(matrixTemplate, cutImage, 0, randomY); + BufferedImage cutImage = CaptchaImageUtils.cutImage(cutBackground, fixedTemplate, randomX, randomY); + CaptchaImageUtils.overlayImage(cutImage, activeTemplate, 0, 0); + CaptchaImageUtils.overlayImage(matrixTemplate, cutImage, 0, randomY); return wrapSliderCaptchaInfo(randomX, randomY, targetBackground, matrixTemplate, param); } finally { // 使用完后关闭流 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/AbstractResourceProvider.java b/src/main/java/cloud/tianai/captcha/resource/AbstractResourceProvider.java similarity index 85% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/AbstractResourceProvider.java rename to src/main/java/cloud/tianai/captcha/resource/AbstractResourceProvider.java index 2058644..4999dda 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/AbstractResourceProvider.java +++ b/src/main/java/cloud/tianai/captcha/resource/AbstractResourceProvider.java @@ -1,6 +1,6 @@ -package cloud.tianai.captcha.template.slider.resource; +package cloud.tianai.captcha.resource; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import java.io.InputStream; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/ImageCaptchaResourceManager.java b/src/main/java/cloud/tianai/captcha/resource/ImageCaptchaResourceManager.java similarity index 91% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/ImageCaptchaResourceManager.java rename to src/main/java/cloud/tianai/captcha/resource/ImageCaptchaResourceManager.java index 638318d..f4625f7 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/ImageCaptchaResourceManager.java +++ b/src/main/java/cloud/tianai/captcha/resource/ImageCaptchaResourceManager.java @@ -1,6 +1,6 @@ -package cloud.tianai.captcha.template.slider.resource; +package cloud.tianai.captcha.resource; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import java.io.InputStream; import java.util.List; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/ResourceProvider.java b/src/main/java/cloud/tianai/captcha/resource/ResourceProvider.java similarity index 76% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/ResourceProvider.java rename to src/main/java/cloud/tianai/captcha/resource/ResourceProvider.java index 00674dd..2a0e8a6 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/ResourceProvider.java +++ b/src/main/java/cloud/tianai/captcha/resource/ResourceProvider.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.resource; +package cloud.tianai.captcha.resource; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import java.io.InputStream; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/ResourceStore.java b/src/main/java/cloud/tianai/captcha/resource/ResourceStore.java similarity index 92% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/ResourceStore.java rename to src/main/java/cloud/tianai/captcha/resource/ResourceStore.java index ec254fc..9727507 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/ResourceStore.java +++ b/src/main/java/cloud/tianai/captcha/resource/ResourceStore.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.resource; +package cloud.tianai.captcha.resource; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import java.util.List; import java.util.Map; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/common/model/dto/Resource.java b/src/main/java/cloud/tianai/captcha/resource/common/model/dto/Resource.java similarity index 69% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/common/model/dto/Resource.java rename to src/main/java/cloud/tianai/captcha/resource/common/model/dto/Resource.java index e2acfb6..13b9f97 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/common/model/dto/Resource.java +++ b/src/main/java/cloud/tianai/captcha/resource/common/model/dto/Resource.java @@ -1,6 +1,6 @@ -package cloud.tianai.captcha.template.slider.resource.common.model.dto; +package cloud.tianai.captcha.resource.common.model.dto; -import cloud.tianai.captcha.template.slider.resource.ResourceProvider; +import cloud.tianai.captcha.resource.ResourceProvider; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/DefaultImageCaptchaResourceManager.java b/src/main/java/cloud/tianai/captcha/resource/impl/DefaultImageCaptchaResourceManager.java similarity index 83% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/impl/DefaultImageCaptchaResourceManager.java rename to src/main/java/cloud/tianai/captcha/resource/impl/DefaultImageCaptchaResourceManager.java index 727e4a3..5691750 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/DefaultImageCaptchaResourceManager.java +++ b/src/main/java/cloud/tianai/captcha/resource/impl/DefaultImageCaptchaResourceManager.java @@ -1,12 +1,14 @@ -package cloud.tianai.captcha.template.slider.resource.impl; +package cloud.tianai.captcha.resource.impl; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceProvider; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; -import cloud.tianai.captcha.template.slider.resource.impl.provider.ClassPathResourceProvider; -import cloud.tianai.captcha.template.slider.resource.impl.provider.FileResourceProvider; -import cloud.tianai.captcha.template.slider.resource.impl.provider.URLResourceProvider; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceProvider; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.resource.impl.provider.FileResourceProvider; +import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider; import java.io.InputStream; import java.util.ArrayList; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/DefaultResourceStore.java b/src/main/java/cloud/tianai/captcha/resource/impl/DefaultResourceStore.java similarity index 90% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/impl/DefaultResourceStore.java rename to src/main/java/cloud/tianai/captcha/resource/impl/DefaultResourceStore.java index 1cc7eeb..1bb2854 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/DefaultResourceStore.java +++ b/src/main/java/cloud/tianai/captcha/resource/impl/DefaultResourceStore.java @@ -1,8 +1,10 @@ -package cloud.tianai.captcha.template.slider.resource.impl; +package cloud.tianai.captcha.resource.impl; -import cloud.tianai.captcha.template.slider.common.util.CollectionUtils; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.common.util.CollectionUtils; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.common.util.CollectionUtils; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import java.util.*; import java.util.concurrent.ThreadLocalRandom; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/ClassPathResourceProvider.java b/src/main/java/cloud/tianai/captcha/resource/impl/provider/ClassPathResourceProvider.java similarity index 75% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/ClassPathResourceProvider.java rename to src/main/java/cloud/tianai/captcha/resource/impl/provider/ClassPathResourceProvider.java index c7dc4fe..33fd4a9 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/ClassPathResourceProvider.java +++ b/src/main/java/cloud/tianai/captcha/resource/impl/provider/ClassPathResourceProvider.java @@ -1,7 +1,9 @@ -package cloud.tianai.captcha.template.slider.resource.impl.provider; +package cloud.tianai.captcha.resource.impl.provider; -import cloud.tianai.captcha.template.slider.resource.AbstractResourceProvider; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.AbstractResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.AbstractResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import java.io.InputStream; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/FileResourceProvider.java b/src/main/java/cloud/tianai/captcha/resource/impl/provider/FileResourceProvider.java similarity index 69% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/FileResourceProvider.java rename to src/main/java/cloud/tianai/captcha/resource/impl/provider/FileResourceProvider.java index ea398cb..ebaee67 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/FileResourceProvider.java +++ b/src/main/java/cloud/tianai/captcha/resource/impl/provider/FileResourceProvider.java @@ -1,7 +1,9 @@ -package cloud.tianai.captcha.template.slider.resource.impl.provider; +package cloud.tianai.captcha.resource.impl.provider; -import cloud.tianai.captcha.template.slider.resource.AbstractResourceProvider; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.AbstractResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.AbstractResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import lombok.SneakyThrows; import java.io.FileInputStream; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/URLResourceProvider.java b/src/main/java/cloud/tianai/captcha/resource/impl/provider/URLResourceProvider.java similarity index 72% rename from src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/URLResourceProvider.java rename to src/main/java/cloud/tianai/captcha/resource/impl/provider/URLResourceProvider.java index 13995e7..5543db7 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/resource/impl/provider/URLResourceProvider.java +++ b/src/main/java/cloud/tianai/captcha/resource/impl/provider/URLResourceProvider.java @@ -1,7 +1,8 @@ -package cloud.tianai.captcha.template.slider.resource.impl.provider; +package cloud.tianai.captcha.resource.impl.provider; -import cloud.tianai.captcha.template.slider.resource.AbstractResourceProvider; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.AbstractResourceProvider; +import cloud.tianai.captcha.resource.AbstractResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import lombok.SneakyThrows; import java.io.InputStream; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/validator/ImageCaptchaValidator.java b/src/main/java/cloud/tianai/captcha/validator/ImageCaptchaValidator.java similarity index 82% rename from src/main/java/cloud/tianai/captcha/template/slider/validator/ImageCaptchaValidator.java rename to src/main/java/cloud/tianai/captcha/validator/ImageCaptchaValidator.java index 31d4e1e..2c98006 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/validator/ImageCaptchaValidator.java +++ b/src/main/java/cloud/tianai/captcha/validator/ImageCaptchaValidator.java @@ -1,7 +1,9 @@ -package cloud.tianai.captcha.template.slider.validator; +package cloud.tianai.captcha.validator; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; import java.util.Map; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/validator/common/constant/TrackTypeConstant.java b/src/main/java/cloud/tianai/captcha/validator/common/constant/TrackTypeConstant.java similarity index 81% rename from src/main/java/cloud/tianai/captcha/template/slider/validator/common/constant/TrackTypeConstant.java rename to src/main/java/cloud/tianai/captcha/validator/common/constant/TrackTypeConstant.java index 766ca17..09f9929 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/validator/common/constant/TrackTypeConstant.java +++ b/src/main/java/cloud/tianai/captcha/validator/common/constant/TrackTypeConstant.java @@ -1,4 +1,4 @@ -package cloud.tianai.captcha.template.slider.validator.common.constant; +package cloud.tianai.captcha.validator.common.constant; /** * @Author: 天爱有情 diff --git a/src/main/java/cloud/tianai/captcha/template/slider/validator/common/model/dto/ImageCaptchaTrack.java b/src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java similarity index 83% rename from src/main/java/cloud/tianai/captcha/template/slider/validator/common/model/dto/ImageCaptchaTrack.java rename to src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java index 691597f..aad273d 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/validator/common/model/dto/ImageCaptchaTrack.java +++ b/src/main/java/cloud/tianai/captcha/validator/common/model/dto/ImageCaptchaTrack.java @@ -1,6 +1,7 @@ -package cloud.tianai.captcha.template.slider.validator.common.model.dto; +package cloud.tianai.captcha.validator.common.model.dto; -import cloud.tianai.captcha.template.slider.validator.common.constant.TrackTypeConstant; +import cloud.tianai.captcha.validator.common.constant.TrackTypeConstant; +import cloud.tianai.captcha.validator.common.constant.TrackTypeConstant; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/validator/impl/BasicCaptchaTrackValidator.java b/src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java similarity index 90% rename from src/main/java/cloud/tianai/captcha/template/slider/validator/impl/BasicCaptchaTrackValidator.java rename to src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java index a74f50e..73abb83 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/validator/impl/BasicCaptchaTrackValidator.java +++ b/src/main/java/cloud/tianai/captcha/validator/impl/BasicCaptchaTrackValidator.java @@ -1,9 +1,13 @@ -package cloud.tianai.captcha.template.slider.validator.impl; +package cloud.tianai.captcha.validator.impl; -import cloud.tianai.captcha.template.slider.common.util.CaptchaUtils; -import cloud.tianai.captcha.template.slider.common.util.CollectionUtils; -import cloud.tianai.captcha.template.slider.common.util.ObjectUtils; -import cloud.tianai.captcha.template.slider.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.common.util.CaptchaUtils; +import cloud.tianai.captcha.common.util.CollectionUtils; +import cloud.tianai.captcha.common.util.ObjectUtils; +import cloud.tianai.captcha.common.util.CaptchaUtils; +import cloud.tianai.captcha.common.util.CollectionUtils; +import cloud.tianai.captcha.common.util.ObjectUtils; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; import java.util.List; import java.util.Map; diff --git a/src/main/java/cloud/tianai/captcha/template/slider/validator/impl/SimpleImageCaptchaValidator.java b/src/main/java/cloud/tianai/captcha/validator/impl/SimpleImageCaptchaValidator.java similarity index 90% rename from src/main/java/cloud/tianai/captcha/template/slider/validator/impl/SimpleImageCaptchaValidator.java rename to src/main/java/cloud/tianai/captcha/validator/impl/SimpleImageCaptchaValidator.java index 468853b..05ef074 100644 --- a/src/main/java/cloud/tianai/captcha/template/slider/validator/impl/SimpleImageCaptchaValidator.java +++ b/src/main/java/cloud/tianai/captcha/validator/impl/SimpleImageCaptchaValidator.java @@ -1,14 +1,23 @@ -package cloud.tianai.captcha.template.slider.validator.impl; +package cloud.tianai.captcha.validator.impl; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.common.util.CaptchaUtils; -import cloud.tianai.captcha.template.slider.common.util.CollectionUtils; -import cloud.tianai.captcha.template.slider.common.util.ObjectUtils; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ClickImageCheckDefinition; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.validator.ImageCaptchaValidator; -import cloud.tianai.captcha.template.slider.validator.common.constant.TrackTypeConstant; -import cloud.tianai.captcha.template.slider.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.util.CaptchaUtils; +import cloud.tianai.captcha.common.util.CollectionUtils; +import cloud.tianai.captcha.common.util.ObjectUtils; +import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.common.util.CaptchaUtils; +import cloud.tianai.captcha.common.util.CollectionUtils; +import cloud.tianai.captcha.common.util.ObjectUtils; +import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.validator.ImageCaptchaValidator; +import cloud.tianai.captcha.validator.common.constant.TrackTypeConstant; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.validator.ImageCaptchaValidator; +import cloud.tianai.captcha.validator.common.constant.TrackTypeConstant; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -206,7 +215,7 @@ public class SimpleImageCaptchaValidator implements ImageCaptchaValidator { return doValidClickCaptcha(imageCaptchaTrack, sliderCaptchaValidData, tolerant, type); } // 不支持的类型 - log.warn("校验验证码警告, 不支持的验证码类型:{}, 请手动扩展 cloud.tianai.captcha.template.slider.validator.impl.SimpleImageCaptchaValidator.doValid 进行校验扩展", type); + log.warn("校验验证码警告, 不支持的验证码类型:{}, 请手动扩展 cloud.tianai.captcha.validator.impl.SimpleImageCaptchaValidator.doValid 进行校验扩展", type); return false; } diff --git a/src/main/test/java/example/DrawCaptchaUtil.java b/src/main/test/java/example/DrawCaptchaUtil.java index 6798520..b7b6dc8 100644 --- a/src/main/test/java/example/DrawCaptchaUtil.java +++ b/src/main/test/java/example/DrawCaptchaUtil.java @@ -1,7 +1,7 @@ package example; -import cloud.tianai.captcha.template.slider.resource.common.model.dto.Resource; -import cloud.tianai.captcha.template.slider.resource.impl.provider.ClassPathResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; import lombok.SneakyThrows; import sun.font.FontDesignMetrics; diff --git a/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java b/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java index 53cac4c..9e31760 100644 --- a/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java +++ b/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java @@ -1,15 +1,15 @@ package example; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.RotateImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.impl.CacheImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.impl.StandardConcatImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.impl.StandardRotateImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.impl.DefaultImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.impl.DefaultResourceStore; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.model.dto.RotateImageCaptchaInfo; +import cloud.tianai.captcha.generator.impl.CacheImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.StandardConcatImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.StandardRotateImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultResourceStore; import java.util.concurrent.TimeUnit; diff --git a/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java b/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java index 3c77da5..ed58a90 100644 --- a/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java +++ b/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java @@ -1,14 +1,14 @@ package example; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.RotateImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.impl.CacheImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.generator.impl.StandardRotateImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.ResourceStore; -import cloud.tianai.captcha.template.slider.resource.impl.DefaultImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.impl.DefaultResourceStore; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.common.model.dto.RotateImageCaptchaInfo; +import cloud.tianai.captcha.generator.impl.CacheImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.StandardRotateImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceStore; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultResourceStore; import java.util.concurrent.TimeUnit; diff --git a/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java b/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java index 3ee2b90..dc5bc7d 100644 --- a/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java +++ b/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java @@ -1,12 +1,12 @@ package example; -import cloud.tianai.captcha.template.slider.common.constant.CaptchaTypeConstant; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.GenerateParam; -import cloud.tianai.captcha.template.slider.generator.common.model.dto.ImageCaptchaInfo; -import cloud.tianai.captcha.template.slider.generator.impl.StandardRandomWordClickImageCaptchaGenerator; -import cloud.tianai.captcha.template.slider.resource.ImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.resource.impl.DefaultImageCaptchaResourceManager; -import cloud.tianai.captcha.template.slider.validator.impl.BasicCaptchaTrackValidator; +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +import cloud.tianai.captcha.generator.common.model.dto.GenerateParam; +import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; +import cloud.tianai.captcha.generator.impl.StandardRandomWordClickImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; +import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; import java.util.Map;