U 升级为1.3.3

This commit is contained in:
天爱有情
2022-08-25 11:09:18 +08:00
parent e288dc9b91
commit 0b636eaa9f
17 changed files with 229 additions and 84 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId>
<version>1.3.2</version>
<version>1.3.3</version>
<name>tianai-captcha</name>
<description>行为验证码</description>
+17 -7
View File
@@ -32,7 +32,7 @@
<dependency>
<groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId>
<version>1.3.2</version>
<version>1.3.3</version>
</dependency>
```
@@ -55,7 +55,8 @@ 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);
ImageTransform imageTransform = new Base64ImageTransform();
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true);
/*
生成滑块验证码图片, 可选项
SLIDER (滑块验证码)
@@ -124,6 +125,8 @@ public class Test2 {
- 资源存储(`ResourceStore`) 负责存储背景图和模板图
- 资源提供者(`ResourceProvider`) 负责将资源存储器中对应的资源转换为文件流
- 一般资源存储器中存储的是图片的url地址或者id之类, 资源提供者 就是负责将url或者别的id转换为真正的图片文件
- 图片转换器 (`ImageTransform`)
- 主要负责将图片文件流转换成字符串类型,可以是base64格式/url 或其它加密格式,默认实现是bas64格式
## 扩展
@@ -134,9 +137,11 @@ package example.readme;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageTransform;
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.transform.Base64ImageTransform;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
@@ -144,8 +149,9 @@ public class Test3 {
public static void main(String[] args) {
// 资源管理器
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
ImageTransform imageTransform = new Base64ImageTransform();
// 标准验证码生成器
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true);
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true);
// 生成 具有混淆的 滑块验证码 (目前只有滑块验证码支持混淆滑块, 旋转验证,滑动还原,点选验证 均不支持混淆功能)
ImageCaptchaInfo imageCaptchaInfo = imageCaptchaGenerator.generateCaptchaImage(GenerateParam.builder()
.type(CaptchaTypeConstant.SLIDER)
@@ -176,8 +182,9 @@ public class Test4 {
public static void main(String[] args) {
// 资源管理器
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
ImageTransform imageTransform = new Base64ImageTransform();
// 标准验证码生成器
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(true);
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(true);
// 生成旋转验证码 图片类型为 webp
// 注意 tianai-captcha-1.3.2 后面默认删除了生成webp格式图片需要用户自定义添加webp转换的工具,需要用户自定义添加和扩展
// 参考 https://bitbucket.org/luciad/webp-imageio
@@ -278,9 +285,10 @@ import cloud.tianai.captcha.resource.impl.DefaultImageCaptchaResourceManager;
public class Test6 {
public static void main(String[] args) {
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
ImageTransform imageTransform = new Base64ImageTransform();
//为方便快速上手 系统本身自带了一张图片和两套滑块模板,如果不想用系统自带的可以不让它加载系统自带的
// 第二个构造参数设置为false时将不加载默认的图片和模板
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false);
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager, imageTransform).init(false);
}
}
@@ -331,7 +339,8 @@ public class Test7 {
}
};
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager).init(false);
ImageTransform imageTransform = new Base64ImageTransform();
ImageCaptchaGenerator imageCaptchaGenerator = new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform).init(false);
// 注册
imageCaptchaResourceManager.registerResourceProvider(resourceProvider);
}
@@ -362,7 +371,8 @@ public class Test8 {
// 参数三: 出错后 等待xx时间再进行生成
// 参数四: 检查时间间隔
ImageCaptchaResourceManager imageCaptchaResourceManager = new DefaultImageCaptchaResourceManager();
ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager), 10, 1000, 100);
ImageTransform imageTransform = new Base64ImageTransform();
ImageCaptchaGenerator imageCaptchaGenerator = new CacheImageCaptchaGenerator(new MultiImageCaptchaGenerator(imageCaptchaResourceManager,imageTransform), 10, 1000, 100);
imageCaptchaGenerator.init(true);
// 生成滑块图片
ImageCaptchaInfo slideImageInfo = imageCaptchaGenerator.generateCaptchaImage(CaptchaTypeConstant.SLIDER);
@@ -2,8 +2,7 @@ package cloud.tianai.captcha.generator;
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils;
import cloud.tianai.captcha.generator.common.util.ImgWriter;
import cloud.tianai.captcha.generator.impl.transform.Base64ImageTransform;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
import cloud.tianai.captcha.resource.common.model.dto.Resource;
import lombok.Getter;
@@ -11,11 +10,7 @@ import lombok.Setter;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Base64;
import java.util.Map;
/**
@@ -37,10 +32,12 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
/** 默认滑块图片类型. */
public String defaultSliderImageType = DEFAULT_SLIDER_IMAGE_TYPE;
@Getter
@Setter
/** 资源管理器. */
protected ImageCaptchaResourceManager imageCaptchaResourceManager;
/** 图片转换器. */
protected ImageTransform imageTransform;
@Getter
private boolean init = false;
@@ -55,6 +52,10 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
init = true;
try {
log.info("图片验证码[{}]初始化...", this.getClass().getSimpleName());
// 设置默认图片转换器
if (getImageTransform() == null) {
setImageTransform(new Base64ImageTransform());
}
doInit(initDefaultResource);
} catch (Exception e) {
init = false;
@@ -90,51 +91,6 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
return doGenerateCaptchaImage(param);
}
/**
* 将图片转换成字符串格式
*
* @param bufferedImage 图片
* @param formatType 格式化类型
* @return String
*/
@SneakyThrows(Exception.class)
public String transform(BufferedImage bufferedImage, String formatType) {
// 这里判断处理一下,加一些警告日志
String result = beforeTransform(bufferedImage, formatType);
if (result != null) {
return result;
}
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (CaptchaImageUtils.isPng(formatType) || CaptchaImageUtils.isJpeg(formatType)) {
// 如果是 jpg 或者 png图片的话 用hutool的生成
ImgWriter.write(bufferedImage, formatType, byteArrayOutputStream, -1);
} else {
ImageIO.write(bufferedImage, formatType, byteArrayOutputStream);
}
//转换成字节码
byte[] data = byteArrayOutputStream.toByteArray();
String base64 = Base64.getEncoder().encodeToString(data);
return "data:image/" + formatType + ";base64,".concat(base64);
}
public String beforeTransform(BufferedImage bufferedImage, String formatType) {
// int type = bufferedImage.getType();
// if (BufferedImage.TYPE_4BYTE_ABGR == type) {
// // png , 如果转换的是jpg的话
// if (CaptchaImageUtils.isJpeg(formatType)) {
// // bufferedImage为 png 但是转换的图片为 jpg
// if (log.isWarnEnabled()) {
// log.warn("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致");
// } else {
// System.err.println("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致");
// }
// }
// }
// 其它的暂时不考虑
return null;
}
protected InputStream getTemplateFile(Map<String, Resource> templateImages, String imageName) {
Resource resource = templateImages.get(imageName);
if (resource == null) {
@@ -169,4 +125,19 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
public ImageCaptchaResourceManager getImageResourceManager() {
return imageCaptchaResourceManager;
}
@Override
public void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager) {
this.imageCaptchaResourceManager = imageCaptchaResourceManager;
}
@Override
public ImageTransform getImageTransform() {
return imageTransform;
}
@Override
public void setImageTransform(ImageTransform imageTransform) {
this.imageTransform = imageTransform;
}
}
@@ -15,6 +15,7 @@ public interface ImageCaptchaGenerator {
/**
* 初始化
*
* @param initDefaultResource 是否初始化默认资源
* @return ImageCaptchaGenerator
*/
@@ -55,4 +56,26 @@ public interface ImageCaptchaGenerator {
*/
ImageCaptchaResourceManager getImageResourceManager();
/**
* 设置滑块验证码资源管理器
*
* @param imageCaptchaResourceManager
*/
void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager);
/**
* 获取图片转换器
*
* @return ImageTransform
*/
ImageTransform getImageTransform();
/**
* 设置图片转换器
*
* @param imageTransform imageTransform
* @return ImageTransform
*/
void setImageTransform(ImageTransform imageTransform);
}
@@ -14,9 +14,10 @@ public interface ImageCaptchaGeneratorProvider {
* 生成/获取 ImageCaptchaGenerator
*
* @param resourceManager resourceManager
* @param imageTransform imageTransform
* @return ImageCaptchaGenerator
*/
ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager);
ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform);
/**
* 验证码类型
@@ -0,0 +1,20 @@
package cloud.tianai.captcha.generator;
import java.awt.image.BufferedImage;
/**
* @Author: 天爱有情
* @date 2022/8/25 10:21
* @Description 图片转换为字符串, 扩展接口, 可以转换为文件地址等
*/
public interface ImageTransform {
/**
* 转换
*
* @param bufferedImage 图片
* @param transformType 转换类型
* @return String
*/
String transform(BufferedImage bufferedImage, String transformType);
}
@@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl;
import cloud.tianai.captcha.common.util.NamedThreadFactory;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
@@ -182,4 +183,19 @@ public class CacheImageCaptchaGenerator implements ImageCaptchaGenerator {
public ImageCaptchaResourceManager getImageResourceManager() {
return target.getImageResourceManager();
}
@Override
public void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager) {
target.setImageResourceManager(imageCaptchaResourceManager);
}
@Override
public ImageTransform getImageTransform() {
return target.getImageTransform();
}
@Override
public void setImageTransform(ImageTransform imageTransform) {
target.setImageTransform(imageTransform);
}
}
@@ -5,6 +5,7 @@ import cloud.tianai.captcha.common.util.ObjectUtils;
import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
import cloud.tianai.captcha.generator.impl.provider.StandardConcatImageCaptchaGeneratorProvider;
@@ -33,10 +34,16 @@ public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator {
private String defaultCaptcha = CaptchaTypeConstant.SLIDER;
protected boolean initDefaultResource = false;
public MultiImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager) {
super(imageCaptchaResourceManager);
}
public MultiImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) {
super(imageCaptchaResourceManager);
setImageTransform(imageTransform);
}
@Override
protected void doInit(boolean initDefaultResource) {
this.initDefaultResource = initDefaultResource;
@@ -94,8 +101,24 @@ public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator {
}
imageCaptchaGenerator = imageCaptchaGeneratorMap.computeIfAbsent(type, k ->
// get and init
provider.get(getImageCaptchaResourceManager()).init(initDefaultResource));
provider.get(getImageResourceManager(), getImageTransform()).init(initDefaultResource));
}
return imageCaptchaGenerator;
}
@Override
public void setImageResourceManager(ImageCaptchaResourceManager imageCaptchaResourceManager) {
super.setImageResourceManager(imageCaptchaResourceManager);
for (ImageCaptchaGenerator imageCaptchaGenerator : imageCaptchaGeneratorMap.values()) {
imageCaptchaGenerator.setImageResourceManager(imageCaptchaResourceManager);
}
}
@Override
public void setImageTransform(ImageTransform imageTransform) {
super.setImageTransform(imageTransform);
for (ImageCaptchaGenerator imageCaptchaGenerator : imageCaptchaGeneratorMap.values()) {
imageCaptchaGenerator.setImageTransform(imageTransform);
}
}
}
@@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
@@ -31,6 +32,11 @@ public class StandardConcatImageCaptchaGenerator extends AbstractImageCaptchaGen
super(imageCaptchaResourceManager);
}
public StandardConcatImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) {
super(imageCaptchaResourceManager);
setImageTransform(imageTransform);
}
@Override
protected void doInit(boolean initDefaultResource) {
if (initDefaultResource) {
@@ -80,7 +86,7 @@ public class StandardConcatImageCaptchaGenerator extends AbstractImageCaptchaGen
@SneakyThrows
private ImageCaptchaInfo wrapConcatCaptchaInfo(int randomX, int randomY, BufferedImage bgImage, GenerateParam param) {
String backGroundImageBase64 = transform(bgImage, param.getBackgroundFormatName());
String backGroundImageBase64 = getImageTransform().transform(bgImage, param.getBackgroundFormatName());
ImageCaptchaInfo imageCaptchaInfo = ImageCaptchaInfo.of(backGroundImageBase64,
null,
bgImage.getWidth(),
@@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.common.util.FontUtils;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.common.model.dto.ClickImageCheckDefinition;
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
@@ -57,11 +58,13 @@ public class StandardRandomWordClickImageCaptchaGenerator extends AbstractClickI
protected float currentFontTopCoef = 0.0f;
@SneakyThrows
public StandardRandomWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager) {
super(imageCaptchaResourceManager);
this.imageCaptchaResourceManager = imageCaptchaResourceManager;
}
public StandardRandomWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) {
super(imageCaptchaResourceManager);
setImageTransform(imageTransform);
}
@Override
@@ -141,8 +144,8 @@ public class StandardRandomWordClickImageCaptchaGenerator extends AbstractClickI
// 提示图片
BufferedImage tipImage = genTipImage(checkClickImageCheckDefinitionList).getImage();
ImageCaptchaInfo clickImageCaptchaInfo = new ImageCaptchaInfo();
clickImageCaptchaInfo.setBackgroundImage(transform(bgImage, param.getBackgroundFormatName()));
clickImageCaptchaInfo.setSliderImage(transform(tipImage, param.getSliderFormatName()));
clickImageCaptchaInfo.setBackgroundImage(getImageTransform().transform(bgImage, param.getBackgroundFormatName()));
clickImageCaptchaInfo.setSliderImage(getImageTransform().transform(tipImage, param.getSliderFormatName()));
clickImageCaptchaInfo.setBgImageWidth(bgImage.getWidth());
clickImageCaptchaInfo.setBgImageHeight(bgImage.getHeight());
clickImageCaptchaInfo.setSliderImageWidth(tipImage.getWidth());
@@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageTransform;
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;
@@ -29,11 +30,13 @@ import java.util.concurrent.ThreadLocalRandom;
*/
public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGenerator {
protected final ImageCaptchaResourceManager imageCaptchaResourceManager;
public StandardRotateImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager) {
super(imageCaptchaResourceManager);
this.imageCaptchaResourceManager = imageCaptchaResourceManager;
}
public StandardRotateImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) {
super(imageCaptchaResourceManager);
setImageTransform(imageTransform);
}
@Override
@@ -113,8 +116,8 @@ public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGen
private ImageCaptchaInfo wrapRotateCaptchaInfo(double degree, int randomX, BufferedImage backgroundImage, BufferedImage sliderImage, GenerateParam param) {
String backgroundFormatName = param.getBackgroundFormatName();
String sliderFormatName = param.getSliderFormatName();
String backGroundImageBase64 = transform(backgroundImage, backgroundFormatName);
String sliderImageBase64 = transform(sliderImage, sliderFormatName);
String backGroundImageBase64 = getImageTransform().transform(backgroundImage, backgroundFormatName);
String sliderImageBase64 = getImageTransform().transform(sliderImage, sliderFormatName);
return RotateImageCaptchaInfo.of(degree,
randomX,
backGroundImageBase64,
@@ -2,6 +2,7 @@ package cloud.tianai.captcha.generator.impl;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageTransform;
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;
@@ -44,6 +45,11 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen
super(imageCaptchaResourceManager);
}
public StandardSliderImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) {
super(imageCaptchaResourceManager);
setImageTransform(imageTransform);
}
@Override
protected void doInit(boolean initDefaultResource) {
if (initDefaultResource) {
@@ -127,8 +133,8 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen
GenerateParam param) {
String backgroundFormatName = param.getBackgroundFormatName();
String sliderFormatName = param.getSliderFormatName();
String backGroundImageBase64 = transform(backgroundImage, backgroundFormatName);
String sliderImageBase64 = transform(sliderImage, sliderFormatName);
String backGroundImageBase64 = getImageTransform().transform(backgroundImage, backgroundFormatName);
String sliderImageBase64 = getImageTransform().transform(sliderImage, sliderFormatName);
return SliderImageCaptchaInfo.of(randomX, randomY,
backGroundImageBase64,
sliderImageBase64,
@@ -3,8 +3,10 @@ package cloud.tianai.captcha.generator.impl.provider;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.impl.StandardConcatImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
/**
* @Author: 天爱有情
* @date 2022/5/19 15:12
@@ -12,8 +14,8 @@ import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
*/
public class StandardConcatImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider {
@Override
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) {
return new StandardConcatImageCaptchaGenerator(resourceManager);
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) {
return new StandardConcatImageCaptchaGenerator(resourceManager, imageTransform);
}
@Override
@@ -3,13 +3,14 @@ package cloud.tianai.captcha.generator.impl.provider;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.impl.StandardRandomWordClickImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
public class StandardRandomWordClickImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider {
@Override
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) {
return new StandardRandomWordClickImageCaptchaGenerator(resourceManager);
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) {
return new StandardRandomWordClickImageCaptchaGenerator(resourceManager, imageTransform);
}
@Override
@@ -3,6 +3,7 @@ package cloud.tianai.captcha.generator.impl.provider;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.impl.StandardRotateImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
@@ -13,8 +14,8 @@ import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
*/
public class StandardRotateImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider {
@Override
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) {
return new StandardRotateImageCaptchaGenerator(resourceManager);
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) {
return new StandardRotateImageCaptchaGenerator(resourceManager, imageTransform);
}
@Override
@@ -1,8 +1,9 @@
package cloud.tianai.captcha.generator.impl.provider;
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.impl.StandardSliderImageCaptchaGenerator;
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
@@ -13,8 +14,8 @@ import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
*/
public class StandardSliderImageImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider {
@Override
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager) {
return new StandardSliderImageCaptchaGenerator(resourceManager);
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) {
return new StandardSliderImageCaptchaGenerator(resourceManager, imageTransform);
}
@Override
@@ -0,0 +1,58 @@
package cloud.tianai.captcha.generator.impl.transform;
import cloud.tianai.captcha.generator.ImageTransform;
import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils;
import cloud.tianai.captcha.generator.common.util.ImgWriter;
import lombok.SneakyThrows;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
/**
* @Author: 天爱有情
* @date 2022/8/25 10:28
* @Description base64 实现
*/
public class Base64ImageTransform implements ImageTransform {
@Override
@SneakyThrows(IOException.class)
public String transform(BufferedImage bufferedImage, String transformType) {
// 这里判断处理一下,加一些警告日志
String result = beforeTransform(bufferedImage, transformType);
if (result != null) {
return result;
}
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
if (CaptchaImageUtils.isPng(transformType) || CaptchaImageUtils.isJpeg(transformType)) {
// 如果是 jpg 或者 png图片的话 用hutool的生成
ImgWriter.write(bufferedImage, transformType, byteArrayOutputStream, -1);
} else {
ImageIO.write(bufferedImage, transformType, byteArrayOutputStream);
}
//转换成字节码
byte[] data = byteArrayOutputStream.toByteArray();
String base64 = Base64.getEncoder().encodeToString(data);
return "data:image/" + transformType + ";base64,".concat(base64);
}
public String beforeTransform(BufferedImage bufferedImage, String formatType) {
// int type = bufferedImage.getType();
// if (BufferedImage.TYPE_4BYTE_ABGR == type) {
// // png , 如果转换的是jpg的话
// if (CaptchaImageUtils.isJpeg(formatType)) {
// // bufferedImage为 png 但是转换的图片为 jpg
// if (log.isWarnEnabled()) {
// log.warn("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致");
// } else {
// System.err.println("图片验证码转换警告, 原图为 png格式时,指定转换的图片为jpg格式时可能会导致转换异常,如果转换的图片为出现错误,请设置指定转换的类型与原图的类型一致");
// }
// }
// }
// 其它的暂时不考虑
return null;
}
}