From 3377d55eadafc32ed7cc23992a501740a6c48d02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E7=88=B1=E6=9C=89=E6=83=85?= Date: Tue, 24 May 2022 18:00:48 +0800 Subject: [PATCH] U update readme.md --- readme.md | 119 +++++++-- src/main/test/java/example/AnchorPoint.java | 85 ------ .../test/java/example/CaptchaGenTest.java | 59 ----- src/main/test/java/example/DecodeTest.java | 37 --- src/main/test/java/example/DemoTest.java | 15 -- .../test/java/example/DrawCaptchaUtil.java | 250 ------------------ src/main/test/java/example/EncodeTest.java | 37 --- .../StandardConcatCaptchaGeneratorTest.java | 37 --- .../StandardRotateCaptchaGeneratorTest.java | 39 --- ...ardWordClickImageCaptchaGeneratorTest.java | 34 --- src/main/test/java/example/readme/Test.java | 36 +++ src/main/test/java/example/readme/Test2.java | 25 ++ src/main/test/java/example/readme/Test3.java | 26 ++ src/main/test/java/example/readme/Test4.java | 27 ++ src/main/test/java/example/readme/Test5.java | 22 ++ src/main/test/java/example/readme/Test6.java | 15 ++ src/main/test/java/example/readme/Test7.java | 36 +++ src/main/test/java/example/readme/Test8.java | 29 ++ 18 files changed, 308 insertions(+), 620 deletions(-) delete mode 100644 src/main/test/java/example/AnchorPoint.java delete mode 100644 src/main/test/java/example/CaptchaGenTest.java delete mode 100644 src/main/test/java/example/DecodeTest.java delete mode 100644 src/main/test/java/example/DemoTest.java delete mode 100644 src/main/test/java/example/DrawCaptchaUtil.java delete mode 100644 src/main/test/java/example/EncodeTest.java delete mode 100644 src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java delete mode 100644 src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java delete mode 100644 src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java create mode 100644 src/main/test/java/example/readme/Test.java create mode 100644 src/main/test/java/example/readme/Test2.java create mode 100644 src/main/test/java/example/readme/Test3.java create mode 100644 src/main/test/java/example/readme/Test4.java create mode 100644 src/main/test/java/example/readme/Test5.java create mode 100644 src/main/test/java/example/readme/Test6.java create mode 100644 src/main/test/java/example/readme/Test7.java create mode 100644 src/main/test/java/example/readme/Test8.java diff --git a/readme.md b/readme.md index d803f8c..3905025 100644 --- a/readme.md +++ b/readme.md @@ -38,27 +38,30 @@ ### 2. 使用 `ImageCaptchaGenerator`生成器生成验证码 ```java +package example.readme; + 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.generator.impl.StandardSliderImageCaptchaGenerator; -import cloud.tianai.captcha.generator.impl.StandardSliderCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; import cloud.tianai.captcha.validator.ImageCaptchaValidator; import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; +import java.util.Map; + public class Test { public static void main(String[] args) throws InterruptedException { ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - MultiImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); /* 生成滑块验证码图片, 可选项 SLIDER (滑块验证码) ROTATE (旋转验证码) CONCAT (滑动还原验证码) WORD_IMAGE_CLICK (文字点选验证码) - + 更多验证码支持 详见 cloud.tianai.captcha.common.constant.CaptchaTypeConstant */ ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); @@ -71,20 +74,28 @@ public class Test { Map map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo); } } + ``` ### 3. 使用`ImageCaptchaValidator`校验器 验证 ```java -import cloud.tianai.captcha.generator.ImageCaptchaGenerator; -import cloud.tianai.captcha.generator.SliderCaptchaGenerator; +package example.readme; + import cloud.tianai.captcha.validator.ImageCaptchaValidator; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; + +import java.util.Map; public class Test2 { public static void main(String[] args) { ImageCaptchaValidator sliderCaptchaValidator = new BasicCaptchaTrackValidator(); - // 用户传来的行为轨迹和进行校验 + ImageCaptchaTrack imageCaptchaTrack = null; + Map map = null; + Float percentage = null; + // 用户传来的行为轨迹和进行校验 // - imageCaptchaTrack为前端传来的滑动轨迹数据 // - map 为生成验证码时缓存的map数据 boolean check = sliderCaptchaValidator.valid(imageCaptchaTrack, map); @@ -94,6 +105,7 @@ public class Test2 { check = sliderCaptchaValidator.checkPercentage(0.2f, percentage); } } + ``` ## 整体架构设计 @@ -117,19 +129,22 @@ public class Test2 { ### 生成带有混淆滑块的图片 ```java +package example.readme; + import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; 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.generator.impl.MultiImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; -public class Test { +public class Test3 { public static void main(String[] args) { // 资源管理器 ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 标准验证码生成器 - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); // 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能) ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() .type(CaptchaTypeConstant.SLIDER) @@ -140,33 +155,40 @@ public class Test { .build()); } } + ``` ### 生成webp格式的滑块图片 ```java +package example.readme; + import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; 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.generator.impl.MultiImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; -public class Test { +public class Test4 { public static void main(String[] args) { // 资源管理器 ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 标准验证码生成器 - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); // 生成旋转验证码 图片类型为 webp - // 注意 tianai-captcha 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展 + // 注意 tianai-captcha-1.3.2 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展 // 参考 https://bitbucket.org/luciad/webp-imageio - SliderCaptchaInfo slideImageInfo = sliderCaptchaGenerator.generateSlideImageInfo(GenerateParam.builder() + ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() .type(CaptchaTypeConstant.ROTATE) .sliderFormatName("webp") .backgroundFormatName("webp") .build()); + System.out.println(slideImageInfo); } } + ``` ### 添加自定义图片资源 @@ -174,7 +196,9 @@ public class Test { - 自定义图片资源大小为 590*360 格式为jpg ```java - import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +package example.readme; + +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.ResourceStore; import cloud.tianai.captcha.resource.common.model.dto.Resource; @@ -182,18 +206,19 @@ 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 class Test5 { public static void main(String[] args) { ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 通过资源管理器或者资源存储器 ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); - // 添加classpath目录下的 aa.jpg 图片 + // 添加classpath目录下的 aa.jpg 图片 resourceStore.addResource(CaptchaTypeConstant.SLIDER, new Resource(ClassPathResourceProvider.NAME, "/aa.jpg")); // 添加远程url图片资源 resourceStore.addResource(CaptchaTypeConstant.SLIDER,new Resource(URLResourceProvider.NAME, "http://www.xx.com/aa.jpg")); // 内置了通过url 和 classpath读取图片资源,如果想扩展可实现 ResourceProvider 接口,进行自定义扩展 } } + ``` ### 添加自定义模板资源 @@ -209,12 +234,20 @@ public class Test { - 凹槽大小为 200*200 格式为png - 模板大小为 360*360 格式为png,该图为固定格式,是一张纯透明图片 ```java +package example.readme; + +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; 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.common.model.dto.Resource; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; -public class Test { +import java.util.HashMap; +import java.util.Map; + +public class Test6 { public static void main(String[] args) { ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); // 通过资源管理器或者资源存储器 @@ -234,16 +267,22 @@ public class Test { - 清除内置的图片资源和模板资源 ```java +package example.readme; + 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 class Test6 { public static void main(String[] args) { + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); //为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的 // 第二个构造参数设置为false时将不加载默认的图片和模板 - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, false); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false); } } + ``` ### 自定义 `imageCaptchaValidator` 校验器 @@ -260,20 +299,43 @@ public class Test { ### 自定义 `ResourceProvider` 实现自定义文件读取策略, 比如 oss之类的 ```java - import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +package example.readme; + +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; -public class Test { +import java.io.InputStream; + +public class Test7 { public static void main(String[] args) { - // 实现了 ResourceProvider 后 + // 自定义 ResourceProvider + ResourceProvider resourceProvider = new ResourceProvider() { + @Override + public InputStream getResourceInputStream(Resource data) { + return null; + } + + @Override + public boolean supported(String type) { + return false; + } + + @Override + public String getName() { + return null; + } + }; ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false); // 注册 - imageCaptchaResourceManager.registerResourceProvider(new CustomResourceProvider()); + imageCaptchaResourceManager.registerResourceProvider(resourceProvider); } } + ``` ### 扩展,对`StandardImageCaptchaGenerator`增加了缓存模块 @@ -281,6 +343,8 @@ public class Test { > 由于实时生成滑块图片可能会有一点性能影响,内部基于`StandardSliderCaptchaGenerator`进行了提前缓存生成好的图片,`CacheSliderCaptchaGenerator` 这只是基本的缓存逻辑,比较简单,用户可以定义一些更加有意思的扩展,用于突破性能瓶颈 ```java +package example.readme; + import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; @@ -289,15 +353,16 @@ import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; -public class Test { +public class Test8 { public static void main(String[] args) throws InterruptedException { // 使用 CacheSliderCaptchaGenerator 对滑块验证码进行缓存,使其提前生成滑块图片 // 参数一: 真正实现 滑块的 SliderCaptchaGenerator // 参数二: 默认提前缓存多少个 // 参数三: 出错后 等待xx时间再进行生成 - // 参数四: 检查时间间隔 + // 参数四: 检查时间间隔 ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true), 10, 1000, 100); + ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager), 10, 1000, 100); + imageCaptchaGenerator.init(true); // 生成滑块图片 ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); // 获取背景图片的base64 diff --git a/src/main/test/java/example/AnchorPoint.java b/src/main/test/java/example/AnchorPoint.java deleted file mode 100644 index 77b5850..0000000 --- a/src/main/test/java/example/AnchorPoint.java +++ /dev/null @@ -1,85 +0,0 @@ -package example; - - -import java.io.Serializable; - -public class AnchorPoint implements Serializable { - - private static final long serialVersionUID = 2L; - - - /** - * 保持charImgWidth的最大值+1 - */ - private Integer x_iv = 26; - /** - * 保持charImgHeight的最大值+1 - */ - private Integer y_iv = 21; - - private Integer x; - private Integer y; - - public AnchorPoint(){ - this.x = 0; - this.y = 0; - } - - - public AnchorPoint(Integer x, Integer y){ - this.x = x; - this.y = y; - } - - public Integer getX() { - return x; - } - - - public Integer getY() { - return y; - } - - public void setX(Integer x) { - this.x = x; - } - - public void setY(Integer y) { - this.y = y; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AnchorPoint that = (AnchorPoint) o; - - //当X位置小于偏移量进行判段Y轴的偏移量 - if(this.x+this.x_iv > that.getX() || this.x - this.x_iv < that.getX()){ - //当Y轴的偏移量符合安全距离 判断锚点有效 - if(this.y+this.y_iv < that.getY() || this.y-this.y_iv > that.getY()){ - return false; - } - }else{ - //两个对象的X点保持在偏移量之外无需比较Y轴位置,判定锚点有效 - return false; - } - - - return true; - - } - - @Override - public int hashCode() { - return 1; - } - - @Override - public String toString() { - return "DrawXInteger{" + - "x=" + x + - ", y=" + y + - '}'; - } -} \ No newline at end of file diff --git a/src/main/test/java/example/CaptchaGenTest.java b/src/main/test/java/example/CaptchaGenTest.java deleted file mode 100644 index 9277bfa..0000000 --- a/src/main/test/java/example/CaptchaGenTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package example; - -import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; -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.impl.MultiImageCaptchaGenerator; -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.FileResourceProvider; -import cloud.tianai.captcha.validator.ImageCaptchaValidator; -import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; - -import java.util.HashMap; -import java.util.Map; - -import static cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator.DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH; - -public class CaptchaGenTest { - - public static void main(String[] args) { - ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); - // 添加一些系统的资源文件 - resourceStore.addResource(CaptchaTypeConstant.SLIDER, new Resource(FileResourceProvider.NAME, "C:\\Users\\Thinkpad\\Desktop\\111\\66.jpg")); - - // 添加一些系统的 模板文件 - Map template1 = new HashMap<>(4); - template1.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/active.png"))); - template1.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/fixed.png"))); - template1.put(SliderCaptchaConstant.TEMPLATE_MATRIX_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/matrix.png"))); - resourceStore.addTemplate(CaptchaTypeConstant.SLIDER, template1); - - - - MultiImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager); - imageCaptchaGenerator.init(false); - GenerateParam generateParam = GenerateParam.builder() - .type(CaptchaTypeConstant.SLIDER) - .backgroundFormatName("webp") - .sliderFormatName("webp") - .obfuscate(false) - .build(); -// for (int i = 0; i < 10; i++) { - ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(generateParam); - System.out.println(imageCaptchaInfo.getBackgroundImage()); - System.out.println(imageCaptchaInfo.getSliderImage()); - - // 负责计算一些数据存到缓存中,用于校验使用 - // ImageCaptchaValidator负责校验用户滑动滑块是否正确和生成滑块的一些校验数据; 比如滑块到凹槽的百分比值 - ImageCaptchaValidator imageCaptchaValidator = new BasicCaptchaTrackValidator(); - // 这个map数据应该存到缓存中,校验的时候需要用到该数据 - Map map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo); -// } - } -} diff --git a/src/main/test/java/example/DecodeTest.java b/src/main/test/java/example/DecodeTest.java deleted file mode 100644 index 54050a2..0000000 --- a/src/main/test/java/example/DecodeTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package example; - -import com.luciad.imageio.webp.WebPReadParam; - -import javax.imageio.ImageIO; -import javax.imageio.ImageReader; -import javax.imageio.stream.FileImageInputStream; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -public class DecodeTest { - public static void main(String args[]) throws IOException { - String inputWebpPath = "test_pic/test.webp"; - String outputJpgPath = "test_pic/test_.jpg"; - String outputJpegPath = "test_pic/test_.jpeg"; - String outputPngPath = "test_pic/test_.png"; - - // Obtain a WebP ImageReader instance - ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next(); - - // Configure decoding parameters - WebPReadParam readParam = new WebPReadParam(); - readParam.setBypassFiltering(true); - - // Configure the input on the ImageReader - reader.setInput(new FileImageInputStream(new File(inputWebpPath))); - - // Decode the image - BufferedImage image = reader.read(0, readParam); - - ImageIO.write(image, "png", new File(outputPngPath)); - ImageIO.write(image, "jpg", new File(outputJpgPath)); - ImageIO.write(image, "jpeg", new File(outputJpegPath)); - - } -} diff --git a/src/main/test/java/example/DemoTest.java b/src/main/test/java/example/DemoTest.java deleted file mode 100644 index bebc6b2..0000000 --- a/src/main/test/java/example/DemoTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package example; - -import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils; - -import java.awt.image.BufferedImage; -import java.io.FileInputStream; -import java.io.FileNotFoundException; - -public class DemoTest { - - public static void main(String[] args) throws FileNotFoundException { - BufferedImage bufferedImage = CaptchaImageUtils.wrapFile2BufferedImage(new FileInputStream("E:\\projects\\tianai-captcha\\src\\main\\resources\\META-INF\\cut-image\\resource\\1.jpg")); - System.out.println(bufferedImage.getType()); - } -} diff --git a/src/main/test/java/example/DrawCaptchaUtil.java b/src/main/test/java/example/DrawCaptchaUtil.java deleted file mode 100644 index b7b6dc8..0000000 --- a/src/main/test/java/example/DrawCaptchaUtil.java +++ /dev/null @@ -1,250 +0,0 @@ -package example; - -import cloud.tianai.captcha.resource.common.model.dto.Resource; -import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; -import lombok.SneakyThrows; -import sun.font.FontDesignMetrics; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.*; -import java.util.concurrent.ThreadLocalRandom; - -/** - * 绘制验证码 - */ -public class DrawCaptchaUtil { - - /** - * 画布宽度 - */ - private static int canvasWidth = 300; - - /** - * 画布高度 - */ - private static int canvasHeight = 150; - - - /** - * 图片宽度 - */ - private static int imgWidth = 300; - - /** - * 图片高度 - */ - private static int imgHeight = 150; - - /** - * 图中字体数量 - */ - private static int charNumber = 5; - - /** - * 字体大小 - */ - private static int fontSize = 50; - /** - * 字体图片宽度 - */ - private static int charImgWidth = 60; - /** - * 字体图片高度 - */ - private static int charImgHeight = 60; - - - /** - * 绘制验证码图片 - * @param checkCode - * @param bkDirPath - * @return - * @throws IOException - */ - public static BufferedImage drawImg(LinkedHashMap checkCode, String bkDirPath) throws IOException { - - BufferedImage imgCanvas = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_BGR); - Graphics graphics = imgCanvas.getGraphics(); - - - //绘制图形 -// graphics.setColor(new Color(0,0,0,0)); - graphics.fillRect(0, 0, imgWidth, imgHeight); - - File bkPath = randomBackGroundImage(bkDirPath); - - BufferedImage read = ImageIO.read(Files.newInputStream(Paths.get(bkPath.getAbsolutePath()))); - graphics.drawImage(read, 0, 0, null, null); - //绘制字体 -// graphics.setColor(getRandomColor()); - //随机在图片中生成5个绘制点每个绘制点半径能不能重叠 - Set point = new HashSet<>(); - - addPoint(point); - Object[] pointArr = point.toArray(); - List charList = new ArrayList<>(); - for (int i = 0; i < charNumber; i++) { - AnchorPoint p = (AnchorPoint) pointArr[i]; - graphics.drawImage(getCharImg(getRandomColor(), charList), p.getX(), p.getY(), null, null); - - } - //随机获取3个字符串作为校验对象 - Object[] charArr = charList.toArray(); - Random random = new Random(); - for (int i = 0; i < 3; i++) { - int num = random.nextInt(pointArr.length - i); - String key = (String) charArr[num]; - AnchorPoint value = (AnchorPoint) pointArr[num]; - checkCode.put(key, value); - //置换位置 - Object a = pointArr[num]; - pointArr[num] = pointArr[pointArr.length - 1 - i]; - pointArr[pointArr.length - 1 - i] = a; - - a = charArr[num]; - charArr[num] = charArr[charArr.length - 1 - i]; - charArr[charArr.length - 1 - i] = a; - } - - return imgCanvas; - } - - /** - * 在指定目录下随机获取背景图片 - * @param dir - * @return - */ - private static File randomBackGroundImage(String dir) { - File file = new File(dir); - if (file.isDirectory()) { - File[] files = file.listFiles(); - Random random = new Random(); - int i = random.nextInt(files.length); - return files[i]; - } else { - return file; - } - } - - /** - * 添加坐标点 - * @param point - */ - private static void addPoint(Set point) { - Random random = new Random(); - //避免因为坐标点过于特殊导致无法获取下一个坐标点进入死循环,到100置空重新获取 - int clearNumber = 0; - //生成前2个点坐标 - while (point.size() < 2) { - - //添加X坐标点 - point.add(new AnchorPoint(random.nextInt(canvasWidth / 3), random.nextInt(canvasHeight - charImgWidth))); - if (clearNumber == 100) { - point.clear(); - clearNumber = 0; - } - clearNumber++; - - } - clearNumber = 0; - //生成后3个点坐标 - while (point.size() < charNumber) { - //添加X坐标点 - point.add(new AnchorPoint(random.nextInt(canvasWidth - charImgWidth), random.nextInt(canvasHeight - charImgHeight))); - if (clearNumber == 100) { - point.clear(); - clearNumber = 0; - addPoint(point); - break; - } - clearNumber++; - } - - - } - - /** - * 获取文字图片 - * @param fontColor - * @param charList - * @return - * @throws UnsupportedEncodingException - */ - @SneakyThrows - private static BufferedImage getCharImg(Color fontColor, List charList) throws IOException { - BufferedImage fillRect = new BufferedImage(charImgWidth, charImgHeight, BufferedImage.TYPE_INT_ARGB); - Graphics2D g = fillRect.createGraphics(); - g.setColor(new Color(0, 0, 0, 0)); - g.fillRect(0, 0, charImgWidth, charImgHeight); - g.setColor(fontColor); - Resource fontResource = new Resource("", "META-INF/fonts/SIMSUN.TTC"); - InputStream inputStream = new ClassPathResourceProvider().doGetResourceInputStream(fontResource); - Font font = Font.createFont(Font.TRUETYPE_FONT, inputStream); - font = font.deriveFont(Font.BOLD, fontSize); -// Font font = new Font("微软雅黑", Font.BOLD, fontSize); - FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font); -// AffineTransform affineTransform = new AffineTransform(); -// affineTransform.rotate(Math.toRadians(85), 0, 0); -// font.deriveFont(affineTransform); - g.setFont(font); - String charStr = getChineseCharacters(); - charList.add(charStr); - - float left = (60 - 50) / 2f; -// //顶边位置+上升距离(原本字体基线位置对准画布的y坐标导致字体偏上ascent距离,加上ascent后下移刚好顶边吻合) - float top = (60 - 50) / 2f + metrics.getAscent() - 10; - - g.rotate(Math.toRadians(ThreadLocalRandom.current().nextInt(0, 85)), 30, 30); - g.drawString(charStr, left, top); - g.dispose(); - return fillRect; - } - - /** - * 随机获取颜色 - * @return - */ - private static Color getRandomColor() { - Random random = new Random(); - return new Color( - random.nextInt(255), - random.nextInt(255), - random.nextInt(255)); - - } - - /** - * 随机获取中文字 - * @return - * @throws UnsupportedEncodingException - */ - private static String getChineseCharacters() throws UnsupportedEncodingException { - Integer hightPos, lowPos; // 定义高低位 - Random random = new Random(); - hightPos = (176 + Math.abs(random.nextInt(39))); - lowPos = (161 + Math.abs(random.nextInt(93))); - byte[] bytes = new byte[2]; - bytes[0] = hightPos.byteValue(); - bytes[1] = lowPos.byteValue(); - return new String(bytes, "GBK"); - - } - - - public static void main(String[] args) throws IOException { - for (int i = 0; i < 100; i++) { - BufferedImage charImg = getCharImg(getRandomColor(), new ArrayList<>()); - ImageIO.write(charImg, "png", new FileOutputStream("C:\\Users\\tianai\\Desktop\\111\\" + i + ".png")); - - } - } - - -} \ No newline at end of file diff --git a/src/main/test/java/example/EncodeTest.java b/src/main/test/java/example/EncodeTest.java deleted file mode 100644 index 93134dd..0000000 --- a/src/main/test/java/example/EncodeTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package example; - -import com.luciad.imageio.webp.WebPWriteParam; - -import javax.imageio.IIOImage; -import javax.imageio.ImageIO; -import javax.imageio.ImageWriter; -import javax.imageio.stream.FileImageOutputStream; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -public class EncodeTest { - public static void main(String args[]) throws IOException { - String inputPngPath = "test_pic/test.png"; - String inputJpgPath = "test_pic/test.jpg"; - String outputWebpPath = "test_pic/test_.webp"; - - // Obtain an image to encode from somewhere - BufferedImage image = ImageIO.read(new File(inputJpgPath)); - - // Obtain a WebP ImageWriter instance - ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next(); - - // Configure encoding parameters - WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale()); - writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT); - - // Configure the output on the ImageWriter - writer.setOutput(new FileImageOutputStream(new File(outputWebpPath))); - - // Encode - long st = System.currentTimeMillis(); - writer.write(null, new IIOImage(image, null, null), writeParam); - System.out.println("cost: " + (System.currentTimeMillis() - st)); - } -} diff --git a/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java b/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java deleted file mode 100644 index 9e31760..0000000 --- a/src/main/test/java/example/StandardConcatCaptchaGeneratorTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package example; - -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; - -public class StandardConcatCaptchaGeneratorTest { - - public static void main(String[] args) throws InterruptedException { - ResourceStore resourceStore = new DefaultResourceStore(); -// Map template = new HashMap<>(); -// template.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource("file", "C:\\Users\\Thinkpad\\Desktop\\a.png")); -// template.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource("file", "C:\\Users\\Thinkpad\\Desktop\\b.png")); - -// resourceStore.addTemplate(CaptchaTypeConstant.ROTATE, template); -// resourceStore.addResource(CaptchaTypeConstant.ROTATE, new Resource("file", "E:\\projects\\tianai-captcha\\src\\main\\resources\\META-INF\\cut-image\\resource\\1.jpg")); - - ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(resourceStore); - - StandardConcatImageCaptchaGenerator captchaGenerator = new StandardConcatImageCaptchaGenerator(imageCaptchaResourceManager, true); - ImageCaptchaInfo imageCaptchaInfo = captchaGenerator.generateCaptchaImage(CaptchaTypeConstant.CONCAT); - System.out.println("backgroundImage:" + imageCaptchaInfo.getBackgroundImage()); - System.out.println("sliderImage:" + imageCaptchaInfo.getSliderImage()); - - TimeUnit.DAYS.sleep(1); - - } -} diff --git a/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java b/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java deleted file mode 100644 index c824258..0000000 --- a/src/main/test/java/example/StandardRotateCaptchaGeneratorTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package example; - -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; - -public class StandardRotateCaptchaGeneratorTest { - - public static void main(String[] args) throws InterruptedException { - ResourceStore resourceStore = new DefaultResourceStore(); -// Map template = new HashMap<>(); -// template.put(SliderCaptchaConstant.TEMPLATE_FIXED_IMAGE_NAME, new Resource("file", "C:\\Users\\Thinkpad\\Desktop\\a.png")); -// template.put(SliderCaptchaConstant.TEMPLATE_ACTIVE_IMAGE_NAME, new Resource("file", "C:\\Users\\Thinkpad\\Desktop\\b.png")); - -// resourceStore.addTemplate(CaptchaTypeConstant.ROTATE, template); -// resourceStore.addResource(CaptchaTypeConstant.ROTATE, new Resource("file", "E:\\projects\\tianai-captcha\\src\\main\\resources\\META-INF\\cut-image\\resource\\1.jpg")); - - ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(resourceStore); - - CacheImageCaptchaGenerator standardRotateImageCaptchaGenerator = new CacheImageCaptchaGenerator(new StandardRotateImageCaptchaGenerator(imageCaptchaResourceManager), - 20, 1000, 100, TimeUnit.MINUTES.toMillis(3)); - standardRotateImageCaptchaGenerator.init(true); - ImageCaptchaInfo imageCaptchaInfo = standardRotateImageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.ROTATE); - System.out.println("backgroundImage:" + imageCaptchaInfo.getBackgroundImage()); - System.out.println("sliderImage:" + imageCaptchaInfo.getSliderImage()); - System.out.println(((RotateImageCaptchaInfo)imageCaptchaInfo).getDegree()); - - TimeUnit.DAYS.sleep(1); - - } -} diff --git a/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java b/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java deleted file mode 100644 index 391f604..0000000 --- a/src/main/test/java/example/StandardWordClickImageCaptchaGeneratorTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package example; - -import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; -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.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; - -public class StandardWordClickImageCaptchaGeneratorTest { - - public static void main(String[] args) { - ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); - - ImageCaptchaGenerator defaultImageCaptchaResourceManager = - new StandardRandomWordClickImageCaptchaGenerator(imageCaptchaResourceManager).init(true); - - GenerateParam generateParam = new GenerateParam(); - generateParam.setType(CaptchaTypeConstant.WORD_IMAGE_CLICK); - generateParam.setSliderFormatName("png"); - ImageCaptchaInfo imageCaptchaInfo = defaultImageCaptchaResourceManager.generateCaptchaImage(generateParam); - - BasicCaptchaTrackValidator basicCaptchaTrackValidator = new BasicCaptchaTrackValidator(); - Map stringObjectMap = basicCaptchaTrackValidator.generateImageCaptchaValidData(imageCaptchaInfo); - - System.out.println(stringObjectMap); - - System.out.println(imageCaptchaInfo); - } -} diff --git a/src/main/test/java/example/readme/Test.java b/src/main/test/java/example/readme/Test.java new file mode 100644 index 0000000..d494008 --- /dev/null +++ b/src/main/test/java/example/readme/Test.java @@ -0,0 +1,36 @@ +package example.readme; + +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; +import cloud.tianai.captcha.validator.ImageCaptchaValidator; +import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; + +import java.util.Map; + +public class Test { + public static void main(String[] args) throws InterruptedException { + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); + /* + 生成滑块验证码图片, 可选项 + SLIDER (滑块验证码) + ROTATE (旋转验证码) + CONCAT (滑动还原验证码) + WORD_IMAGE_CLICK (文字点选验证码) + + 更多验证码支持 详见 cloud.tianai.captcha.common.constant.CaptchaTypeConstant + */ + ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); + System.out.println(imageCaptchaInfo); + + // 负责计算一些数据存到缓存中,用于校验使用 + // ImageCaptchaValidator负责校验用户滑动滑块是否正确和生成滑块的一些校验数据; 比如滑块到凹槽的百分比值 + ImageCaptchaValidator imageCaptchaValidator = new BasicCaptchaTrackValidator(); + // 这个map数据应该存到缓存中,校验的时候需要用到该数据 + Map map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo); + } +} diff --git a/src/main/test/java/example/readme/Test2.java b/src/main/test/java/example/readme/Test2.java new file mode 100644 index 0000000..5af11c8 --- /dev/null +++ b/src/main/test/java/example/readme/Test2.java @@ -0,0 +1,25 @@ +package example.readme; + +import cloud.tianai.captcha.validator.ImageCaptchaValidator; +import cloud.tianai.captcha.validator.common.model.dto.ImageCaptchaTrack; +import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; + +import java.util.Map; + +public class Test2 { + public static void main(String[] args) { + ImageCaptchaValidator sliderCaptchaValidator = new BasicCaptchaTrackValidator(); + + ImageCaptchaTrack imageCaptchaTrack = null; + Map map = null; + Float percentage = null; + // 用户传来的行为轨迹和进行校验 + // - imageCaptchaTrack为前端传来的滑动轨迹数据 + // - map 为生成验证码时缓存的map数据 + boolean check = sliderCaptchaValidator.valid(imageCaptchaTrack, map); + // 如果只想校验用户是否滑到指定凹槽即可,也可以使用 + // - 参数1 用户传来的百分比数据 + // - 参数2 生成滑块是真实的百分比数据 + check = sliderCaptchaValidator.checkPercentage(0.2f, percentage); + } +} diff --git a/src/main/test/java/example/readme/Test3.java b/src/main/test/java/example/readme/Test3.java new file mode 100644 index 0000000..5f9a529 --- /dev/null +++ b/src/main/test/java/example/readme/Test3.java @@ -0,0 +1,26 @@ +package example.readme; + +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +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.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + +public class Test3 { + public static void main(String[] args) { + // 资源管理器 + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + // 标准验证码生成器 + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); + // 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能) + ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() + .type(CaptchaTypeConstant.SLIDER) + .sliderFormatName("jpeg") + .backgroundFormatName("png") + // 是否添加混淆滑块 + .obfuscate(true) + .build()); + } +} diff --git a/src/main/test/java/example/readme/Test4.java b/src/main/test/java/example/readme/Test4.java new file mode 100644 index 0000000..4965148 --- /dev/null +++ b/src/main/test/java/example/readme/Test4.java @@ -0,0 +1,27 @@ +package example.readme; + +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +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.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + +public class Test4 { + public static void main(String[] args) { + // 资源管理器 + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + // 标准验证码生成器 + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true); + // 生成旋转验证码 图片类型为 webp + // 注意 tianai-captcha 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展 + // 参考 https://bitbucket.org/luciad/webp-imageio + ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() + .type(CaptchaTypeConstant.ROTATE) + .sliderFormatName("webp") + .backgroundFormatName("webp") + .build()); + System.out.println(slideImageInfo); + } +} diff --git a/src/main/test/java/example/readme/Test5.java b/src/main/test/java/example/readme/Test5.java new file mode 100644 index 0000000..4998ab6 --- /dev/null +++ b/src/main/test/java/example/readme/Test5.java @@ -0,0 +1,22 @@ +package example.readme; + +import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; +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 Test5 { + public static void main(String[] args) { + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + // 通过资源管理器或者资源存储器 + ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore(); + // 添加classpath目录下的 aa.jpg 图片 + resourceStore.addResource(CaptchaTypeConstant.SLIDER, new Resource(ClassPathResourceProvider.NAME, "/aa.jpg")); + // 添加远程url图片资源 + resourceStore.addResource(CaptchaTypeConstant.SLIDER,new Resource(URLResourceProvider.NAME, "http://www.xx.com/aa.jpg")); + // 内置了通过url 和 classpath读取图片资源,如果想扩展可实现 ResourceProvider 接口,进行自定义扩展 + } +} diff --git a/src/main/test/java/example/readme/Test6.java b/src/main/test/java/example/readme/Test6.java new file mode 100644 index 0000000..237d1f3 --- /dev/null +++ b/src/main/test/java/example/readme/Test6.java @@ -0,0 +1,15 @@ +package example.readme; + +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 Test6 { + public static void main(String[] args) { + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + //为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的 + // 第二个构造参数设置为false时将不加载默认的图片和模板 + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false); + } +} diff --git a/src/main/test/java/example/readme/Test7.java b/src/main/test/java/example/readme/Test7.java new file mode 100644 index 0000000..a95d715 --- /dev/null +++ b/src/main/test/java/example/readme/Test7.java @@ -0,0 +1,36 @@ +package example.readme; + +import cloud.tianai.captcha.generator.ImageCaptchaGenerator; +import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; +import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; +import cloud.tianai.captcha.resource.ResourceProvider; +import cloud.tianai.captcha.resource.common.model.dto.Resource; +import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; + +import java.io.InputStream; + +public class Test7 { + public static void main(String[] args) { + // 自定义 ResourceProvider + ResourceProvider resourceProvider = new ResourceProvider() { + @Override + public InputStream getResourceInputStream(Resource data) { + return null; + } + + @Override + public boolean supported(String type) { + return false; + } + + @Override + public String getName() { + return null; + } + }; + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false); + // 注册 + imageCaptchaResourceManager.registerResourceProvider(resourceProvider); + } +} diff --git a/src/main/test/java/example/readme/Test8.java b/src/main/test/java/example/readme/Test8.java new file mode 100644 index 0000000..719ba3a --- /dev/null +++ b/src/main/test/java/example/readme/Test8.java @@ -0,0 +1,29 @@ +package example.readme; + +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 Test8 { + public static void main(String[] args) throws InterruptedException { + // 使用 CacheSliderCaptchaGenerator 对滑块验证码进行缓存,使其提前生成滑块图片 + // 参数一: 真正实现 滑块的 SliderCaptchaGenerator + // 参数二: 默认提前缓存多少个 + // 参数三: 出错后 等待xx时间再进行生成 + // 参数四: 检查时间间隔 + ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); + ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager), 10, 1000, 100); + imageCaptchaGenerator.init(true); + // 生成滑块图片 + ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER); + // 获取背景图片的base64 + String backgroundImage = slideImageInfo.getBackgroundImage(); + // 获取滑块图片 + String sliderImage = slideImageInfo.getSliderImage(); + System.out.println(slideImageInfo); + } +}