U update readme.md

This commit is contained in:
天爱有情
2022-05-24 18:00:48 +08:00
parent e074021d09
commit 3377d55ead
18 changed files with 308 additions and 620 deletions
+86 -21
View File
@@ -38,20 +38,23 @@
### 2. 使用 `ImageCaptchaGenerator`生成器生成验证码 ### 2. 使用 `ImageCaptchaGenerator`生成器生成验证码
```java ```java
package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; 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.common.model.dto.ImageCaptchaInfo;
import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; 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.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
import cloud.tianai.captcha.validator.ImageCaptchaValidator; import cloud.tianai.captcha.validator.ImageCaptchaValidator;
import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator; import cloud.tianai.captcha.validator.impl.BasicCaptchaTrackValidator;
import java.util.Map;
public class Test { public class Test {
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
MultiImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true);
/* /*
生成滑块验证码图片, 可选项 生成滑块验证码图片, 可选项
SLIDER (滑块验证码) SLIDER (滑块验证码)
@@ -71,19 +74,27 @@ public class Test {
Map<String, Object> map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo); Map<String, Object> map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo);
} }
} }
``` ```
### 3. 使用`ImageCaptchaValidator`校验器 验证 ### 3. 使用`ImageCaptchaValidator`校验器 验证
```java ```java
import cloud.tianai.captcha.generator.ImageCaptchaGenerator; package example.readme;
import cloud.tianai.captcha.generator.SliderCaptchaGenerator;
import cloud.tianai.captcha.validator.ImageCaptchaValidator; 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 class Test2 {
public static void main(String[] args) { public static void main(String[] args) {
ImageCaptchaValidator sliderCaptchaValidator = new BasicCaptchaTrackValidator(); ImageCaptchaValidator sliderCaptchaValidator = new BasicCaptchaTrackValidator();
ImageCaptchaTrack imageCaptchaTrack = null;
Map<String, Object> map = null;
Float percentage = null;
// 用户传来的行为轨迹和进行校验 // 用户传来的行为轨迹和进行校验
// - imageCaptchaTrack为前端传来的滑动轨迹数据 // - imageCaptchaTrack为前端传来的滑动轨迹数据
// - map 为生成验证码时缓存的map数据 // - map 为生成验证码时缓存的map数据
@@ -94,6 +105,7 @@ public class Test2 {
check = sliderCaptchaValidator.checkPercentage(0.2f, percentage); check = sliderCaptchaValidator.checkPercentage(0.2f, percentage);
} }
} }
``` ```
## 整体架构设计 ## 整体架构设计
@@ -117,19 +129,22 @@ public class Test2 {
### 生成带有混淆滑块的图片 ### 生成带有混淆滑块的图片
```java ```java
package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator; 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.common.model.dto.ImageCaptchaInfo;
import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public class Test { public class Test3 {
public static void main(String[] args) { public static void main(String[] args) {
// 资源管理器 // 资源管理器
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
// 标准验证码生成器 // 标准验证码生成器
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true);
// 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能) // 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能)
ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder() ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder()
.type(CaptchaTypeConstant.SLIDER) .type(CaptchaTypeConstant.SLIDER)
@@ -140,33 +155,40 @@ public class Test {
.build()); .build());
} }
} }
``` ```
### 生成webp格式的滑块图片 ### 生成webp格式的滑块图片
```java ```java
package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator; 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.generator.impl.MultiImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public class Test { public class Test4 {
public static void main(String[] args) { public static void main(String[] args) {
// 资源管理器 // 资源管理器
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
// 标准验证码生成器 // 标准验证码生成器
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, true); ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true);
// 生成旋转验证码 图片类型为 webp // 生成旋转验证码 图片类型为 webp
// 注意 tianai-captcha 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展 // 注意 tianai-captcha-1.3.2 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展
// 参考 https://bitbucket.org/luciad/webp-imageio // 参考 https://bitbucket.org/luciad/webp-imageio
SliderCaptchaInfo slideImageInfo = sliderCaptchaGenerator.generateSlideImageInfo(GenerateParam.builder() ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder()
.type(CaptchaTypeConstant.ROTATE) .type(CaptchaTypeConstant.ROTATE)
.sliderFormatName("webp") .sliderFormatName("webp")
.backgroundFormatName("webp") .backgroundFormatName("webp")
.build()); .build());
System.out.println(slideImageInfo);
} }
} }
``` ```
### 添加自定义图片资源 ### 添加自定义图片资源
@@ -174,6 +196,8 @@ public class Test {
- 自定义图片资源大小为 590*360 格式为jpg - 自定义图片资源大小为 590*360 格式为jpg
```java ```java
package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.ResourceStore; import cloud.tianai.captcha.resource.ResourceStore;
@@ -182,7 +206,7 @@ import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider; import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider;
import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider; import cloud.tianai.captcha.resource.impl.provider.URLResourceProvider;
public class Test { public class Test5 {
public static void main(String[] args) { public static void main(String[] args) {
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
// 通过资源管理器或者资源存储器 // 通过资源管理器或者资源存储器
@@ -194,6 +218,7 @@ public class Test {
// 内置了通过url 和 classpath读取图片资源,如果想扩展可实现 ResourceProvider 接口,进行自定义扩展 // 内置了通过url 和 classpath读取图片资源,如果想扩展可实现 ResourceProvider 接口,进行自定义扩展
} }
} }
``` ```
### 添加自定义模板资源 ### 添加自定义模板资源
@@ -209,12 +234,20 @@ public class Test {
- 凹槽大小为 200*200 格式为png - 凹槽大小为 200*200 格式为png
- 模板大小为 360*360 格式为png,该图为固定格式,是一张纯透明图片 - 模板大小为 360*360 格式为png,该图为固定格式,是一张纯透明图片
```java ```java
package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant; import cloud.tianai.captcha.generator.common.constant.SliderCaptchaConstant;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.ResourceStore; 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.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) { public static void main(String[] args) {
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
// 通过资源管理器或者资源存储器 // 通过资源管理器或者资源存储器
@@ -234,16 +267,22 @@ public class Test {
- 清除内置的图片资源和模板资源 - 清除内置的图片资源和模板资源
```java ```java
package example.readme;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; 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) { public static void main(String[] args) {
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
//为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的 //为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的
// 第二个构造参数设置为false时将不加载默认的图片和模板 // 第二个构造参数设置为false时将不加载默认的图片和模板
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, false); ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false);
} }
} }
``` ```
### 自定义 `imageCaptchaValidator` 校验器 ### 自定义 `imageCaptchaValidator` 校验器
@@ -260,20 +299,43 @@ public class Test {
### 自定义 `ResourceProvider` 实现自定义文件读取策略, 比如 oss之类的 ### 自定义 `ResourceProvider` 实现自定义文件读取策略, 比如 oss之类的
```java ```java
package example.readme;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator; import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; 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 cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public class Test { import java.io.InputStream;
public class Test7 {
public static void main(String[] args) { 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(); 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`增加了缓存模块 ### 扩展,对`StandardImageCaptchaGenerator`增加了缓存模块
@@ -281,6 +343,8 @@ public class Test {
> 由于实时生成滑块图片可能会有一点性能影响,内部基于`StandardSliderCaptchaGenerator`进行了提前缓存生成好的图片,`CacheSliderCaptchaGenerator` 这只是基本的缓存逻辑,比较简单,用户可以定义一些更加有意思的扩展,用于突破性能瓶颈 > 由于实时生成滑块图片可能会有一点性能影响,内部基于`StandardSliderCaptchaGenerator`进行了提前缓存生成好的图片,`CacheSliderCaptchaGenerator` 这只是基本的缓存逻辑,比较简单,用户可以定义一些更加有意思的扩展,用于突破性能瓶颈
```java ```java
package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo; import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
@@ -289,7 +353,7 @@ import cloud.tianai.captcha.generator.impl.MultiImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager; import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager; import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public class Test { public class Test8 {
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
// 使用 CacheSliderCaptchaGenerator 对滑块验证码进行缓存,使其提前生成滑块图片 // 使用 CacheSliderCaptchaGenerator 对滑块验证码进行缓存,使其提前生成滑块图片
// 参数一: 真正实现 滑块的 SliderCaptchaGenerator // 参数一: 真正实现 滑块的 SliderCaptchaGenerator
@@ -297,7 +361,8 @@ public class Test {
// 参数三: 出错后 等待xx时间再进行生成 // 参数三: 出错后 等待xx时间再进行生成
// 参数四: 检查时间间隔 // 参数四: 检查时间间隔
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager(); 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); ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER);
// 获取背景图片的base64 // 获取背景图片的base64
@@ -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 +
'}';
}
}
@@ -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<String, Resource> 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<String, Object> map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo);
// }
}
}
@@ -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));
}
}
-15
View File
@@ -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());
}
}
@@ -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<String, AnchorPoint> 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<AnchorPoint> point = new HashSet<>();
addPoint(point);
Object[] pointArr = point.toArray();
List<String> 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<AnchorPoint> 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<String> 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"));
}
}
}
@@ -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));
}
}
@@ -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<String, Resource> 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);
}
}
@@ -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<String, Resource> 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);
}
}
@@ -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<String, Object> stringObjectMap = basicCaptchaTrackValidator.generateImageCaptchaValidData(imageCaptchaInfo);
System.out.println(stringObjectMap);
System.out.println(imageCaptchaInfo);
}
}
@@ -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<String, Object> map = imageCaptchaValidator.generateImageCaptchaValidData(imageCaptchaInfo);
}
}
@@ -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<String, Object> map = null;
Float percentage = null;
// 用户传来的行为轨迹和进行校验
// - imageCaptchaTrack为前端传来的滑动轨迹数据
// - map 为生成验证码时缓存的map数据
boolean check = sliderCaptchaValidator.valid(imageCaptchaTrack, map);
// 如果只想校验用户是否滑到指定凹槽即可,也可以使用
// - 参数1 用户传来的百分比数据
// - 参数2 生成滑块是真实的百分比数据
check = sliderCaptchaValidator.checkPercentage(0.2f, percentage);
}
}
@@ -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());
}
}
@@ -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);
}
}
@@ -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 接口,进行自定义扩展
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -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);
}
}