mirror of
https://github.com/dromara/tianai-captcha.git
synced 2026-05-07 06:04:34 +08:00
U update readme.md
This commit is contained in:
@@ -38,20 +38,23 @@
|
||||
### 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 (滑块验证码)
|
||||
@@ -71,19 +74,27 @@ public class Test {
|
||||
Map<String, Object> 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<String, Object> map = null;
|
||||
Float percentage = null;
|
||||
// 用户传来的行为轨迹和进行校验
|
||||
// - imageCaptchaTrack为前端传来的滑动轨迹数据
|
||||
// - map 为生成验证码时缓存的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,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.URLResourceProvider;
|
||||
|
||||
public class Test {
|
||||
public class Test5 {
|
||||
public static void main(String[] args) {
|
||||
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
|
||||
// 通过资源管理器或者资源存储器
|
||||
@@ -194,6 +218,7 @@ public class Test {
|
||||
// 内置了通过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,7 +353,7 @@ 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
|
||||
@@ -297,7 +361,8 @@ public class Test {
|
||||
// 参数三: 出错后 等待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
|
||||
|
||||
@@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user