mirror of
https://github.com/dromara/tianai-captcha.git
synced 2026-05-18 06:14:04 +08:00
1.5.0重构;
修复一大堆已知问题, 优化代码, 增加 application 类, 重构拦截器组件, 添加缓存模块,
This commit is contained in:
@@ -8,6 +8,7 @@ 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.impl.transform.Base64ImageTransform;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.Resource;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.ResourceMap;
|
||||
@@ -23,8 +24,6 @@ import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
import static cloud.tianai.captcha.generator.impl.StaticCaptchaPostProcessorManager.*;
|
||||
|
||||
/**
|
||||
* @Author: 天爱有情
|
||||
* @date 2022/4/22 16:30
|
||||
@@ -50,6 +49,8 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
|
||||
/** 图片转换器. */
|
||||
protected ImageTransform imageTransform;
|
||||
|
||||
protected CaptchaInterceptor interceptor;
|
||||
|
||||
@Getter
|
||||
private boolean init = false;
|
||||
|
||||
@@ -102,17 +103,36 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
|
||||
assertInit();
|
||||
CustomData data = new CustomData();
|
||||
CaptchaExchange captchaExchange = CaptchaExchange.create(data, param);
|
||||
ImageCaptchaInfo imageCaptchaInfo = applyPostProcessorBeforeGenerate(captchaExchange, this);
|
||||
ImageCaptchaInfo imageCaptchaInfo = beforeGenerate(captchaExchange);
|
||||
if (imageCaptchaInfo != null) {
|
||||
return imageCaptchaInfo;
|
||||
}
|
||||
doGenerateCaptchaImage(captchaExchange);
|
||||
applyPostProcessorBeforeWrapImageCaptchaInfo(captchaExchange, this);
|
||||
beforeWrapImageCaptchaInfo(captchaExchange);
|
||||
imageCaptchaInfo = wrapImageCaptchaInfo(captchaExchange);
|
||||
applyPostProcessorAfterGenerateCaptchaImage(captchaExchange, imageCaptchaInfo, this);
|
||||
afterGenerateCaptchaImage(captchaExchange, imageCaptchaInfo);
|
||||
return imageCaptchaInfo;
|
||||
}
|
||||
|
||||
protected void afterGenerateCaptchaImage(CaptchaExchange captchaExchange, ImageCaptchaInfo imageCaptchaInfo) {
|
||||
if (interceptor != null) {
|
||||
interceptor.afterGenerateCaptchaImage(interceptor.createContext(), captchaExchange, imageCaptchaInfo, this);
|
||||
}
|
||||
}
|
||||
|
||||
protected void beforeWrapImageCaptchaInfo(CaptchaExchange captchaExchange) {
|
||||
if (interceptor != null) {
|
||||
interceptor.beforeWrapImageCaptchaInfo(interceptor.createContext(), captchaExchange, this);
|
||||
}
|
||||
}
|
||||
|
||||
protected ImageCaptchaInfo beforeGenerate(CaptchaExchange captchaExchange) {
|
||||
if (interceptor != null) {
|
||||
return interceptor.beforeGenerateCaptchaImage(interceptor.createContext(), captchaExchange, this);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ImageCaptchaInfo wrapImageCaptchaInfo(CaptchaExchange captchaExchange) {
|
||||
ImageCaptchaInfo imageCaptchaInfo = doWrapImageCaptchaInfo(captchaExchange);
|
||||
imageCaptchaInfo.setData(captchaExchange.getCustomData());
|
||||
@@ -250,4 +270,14 @@ public abstract class AbstractImageCaptchaGenerator implements ImageCaptchaGener
|
||||
public void setImageTransform(ImageTransform imageTransform) {
|
||||
this.imageTransform = imageTransform;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CaptchaInterceptor getInterceptor() {
|
||||
return interceptor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInterceptor(CaptchaInterceptor interceptor) {
|
||||
this.interceptor = interceptor;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package cloud.tianai.captcha.generator;
|
||||
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
|
||||
/**
|
||||
@@ -78,4 +79,9 @@ public interface ImageCaptchaGenerator {
|
||||
*/
|
||||
void setImageTransform(ImageTransform imageTransform);
|
||||
|
||||
|
||||
CaptchaInterceptor getInterceptor();
|
||||
|
||||
void setInterceptor(CaptchaInterceptor interceptor);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cloud.tianai.captcha.generator;
|
||||
|
||||
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
|
||||
/**
|
||||
@@ -17,7 +18,7 @@ public interface ImageCaptchaGeneratorProvider {
|
||||
* @param imageTransform imageTransform
|
||||
* @return ImageCaptchaGenerator
|
||||
*/
|
||||
ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform);
|
||||
ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor);
|
||||
|
||||
/**
|
||||
* 验证码类型
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
package cloud.tianai.captcha.generator.common.model.dto;
|
||||
|
||||
import cloud.tianai.captcha.common.AnyMap;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: 天爱有情
|
||||
* @date 2023/4/24 10:27
|
||||
@@ -14,9 +12,9 @@ import java.util.Map;
|
||||
public class CustomData {
|
||||
|
||||
/** 透传字段,用于传给前端. */
|
||||
private Map<String, Object> viewData;
|
||||
private AnyMap viewData;
|
||||
/** 内部使用的字段数据. */
|
||||
private Map<String, Object> data;
|
||||
private AnyMap data;
|
||||
/**
|
||||
* 扩展字段
|
||||
*/
|
||||
@@ -24,14 +22,14 @@ public class CustomData {
|
||||
|
||||
public void putViewData(String key, Object data) {
|
||||
if (this.viewData == null) {
|
||||
this.viewData = new HashMap<>();
|
||||
this.viewData = new AnyMap();
|
||||
}
|
||||
this.viewData.put(key, data);
|
||||
}
|
||||
|
||||
public void putData(String key, Object data) {
|
||||
if (this.data == null) {
|
||||
this.data = new HashMap<>();
|
||||
this.data = new AnyMap();
|
||||
}
|
||||
this.data.put(key, data);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package cloud.tianai.captcha.generator.common.model.dto;
|
||||
|
||||
import cloud.tianai.captcha.common.AnyMap;
|
||||
import cloud.tianai.captcha.common.constant.CaptchaTypeConstant;
|
||||
import lombok.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Author: 天爱有情
|
||||
* @date 2022/2/11 9:44
|
||||
@@ -32,7 +30,7 @@ public class GenerateParam {
|
||||
/** 滑动图片标签,用户二级过滤模板图片,或指定某模板图片.. */
|
||||
private String templateImageTag;
|
||||
/** 扩展参数. */
|
||||
private Map<String, Object> param = new HashMap<>(4);
|
||||
private AnyMap param = new AnyMap();
|
||||
|
||||
public void addParam(String key, Object value) {
|
||||
doGetOrCreateParam().put(key, value);
|
||||
@@ -42,9 +40,9 @@ public class GenerateParam {
|
||||
return param == null ? null : param.get(key);
|
||||
}
|
||||
|
||||
private Map<String, Object> doGetOrCreateParam() {
|
||||
private AnyMap doGetOrCreateParam() {
|
||||
if (param == null) {
|
||||
param = new HashMap<>(4);
|
||||
param = new AnyMap();
|
||||
}
|
||||
return param;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ 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.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
@@ -198,4 +199,14 @@ public class CacheImageCaptchaGenerator implements ImageCaptchaGenerator {
|
||||
public void setImageTransform(ImageTransform imageTransform) {
|
||||
target.setImageTransform(imageTransform);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CaptchaInterceptor getInterceptor() {
|
||||
return target.getInterceptor();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInterceptor(CaptchaInterceptor interceptor) {
|
||||
target.setInterceptor(interceptor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ public class MultiImageCaptchaGenerator extends AbstractImageCaptchaGenerator {
|
||||
if (provider == null) {
|
||||
throw new IllegalArgumentException("生成验证码失败,错误的type类型:" + t);
|
||||
}
|
||||
return provider.get(getImageResourceManager(), getImageTransform()).init(initDefaultResource);
|
||||
return provider.get(getImageResourceManager(), getImageTransform(), getInterceptor()).init(initDefaultResource);
|
||||
});
|
||||
return imageCaptchaGenerator;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
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.CaptchaExchange;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.GenerateParam;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
|
||||
import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import cloud.tianai.captcha.resource.ResourceStore;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.Resource;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.ResourceMap;
|
||||
import cloud.tianai.captcha.resource.impl.provider.ClassPathResourceProvider;
|
||||
import lombok.SneakyThrows;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.FileOutputStream;
|
||||
import java.util.UUID;
|
||||
|
||||
import static cloud.tianai.captcha.common.constant.CommonConstant.*;
|
||||
|
||||
public class SliderImageCaptchaV2Generator extends AbstractImageCaptchaGenerator {
|
||||
|
||||
/** 模板滑块固定名称. */
|
||||
public static String TEMPLATE_ACTIVE_IMAGE_NAME = "active.png";
|
||||
/** 模板凹槽固定名称. */
|
||||
public static String TEMPLATE_FIXED_IMAGE_NAME = "fixed.png";
|
||||
/** 模板蒙版. */
|
||||
public static String TEMPLATE_MASK_IMAGE_NAME = "mask.png";
|
||||
|
||||
public SliderImageCaptchaV2Generator(ImageCaptchaResourceManager imageCaptchaResourceManager) {
|
||||
super(imageCaptchaResourceManager);
|
||||
}
|
||||
|
||||
public SliderImageCaptchaV2Generator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform) {
|
||||
super(imageCaptchaResourceManager);
|
||||
setImageTransform(imageTransform);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doInit(boolean initDefaultResource) {
|
||||
if (initDefaultResource) {
|
||||
initDefaultResource();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SneakyThrows
|
||||
protected void doGenerateCaptchaImage(CaptchaExchange captchaExchange) {
|
||||
GenerateParam param = captchaExchange.getParam();
|
||||
ResourceMap templateResource = requiredRandomGetTemplate(param.getType(), param.getTemplateImageTag());
|
||||
Resource resourceImage = requiredRandomGetResource(param.getType(), param.getBackgroundImageTag());
|
||||
BufferedImage background = getResourceImage(resourceImage);
|
||||
BufferedImage fixedTemplate = getTemplateImage(templateResource, TEMPLATE_FIXED_IMAGE_NAME);
|
||||
BufferedImage activeTemplate = getTemplateImage(templateResource, TEMPLATE_ACTIVE_IMAGE_NAME);
|
||||
|
||||
int randomX = randomInt(fixedTemplate.getWidth() + 5, background.getWidth() - background.getHeight() - 10);
|
||||
int randomY = randomInt(background.getHeight() - fixedTemplate.getHeight());
|
||||
|
||||
|
||||
// 随机角度
|
||||
// double randomDegree = randomDouble(10, 80);
|
||||
// double randomDegree2 = randomDouble(10, 80);
|
||||
|
||||
int randomObfuscateX = randomObfuscateX(randomX, fixedTemplate.getWidth(), background.getWidth() - background.getHeight() - 10);
|
||||
int randomObfuscateY = randomInt(background.getHeight() - fixedTemplate.getHeight());
|
||||
|
||||
double rotatePosRight = background.getHeight();
|
||||
|
||||
|
||||
BufferedImage cutImage = CaptchaImageUtils.cutImage(background, fixedTemplate, randomX, randomY);
|
||||
|
||||
|
||||
// 正确的图
|
||||
Graphics2D backgroundGraphics = background.createGraphics();
|
||||
// backgroundGraphics.rotate(Math.toRadians(randomDegree), randomX + fixedTemplate.getWidth(), rotatePosRight);
|
||||
backgroundGraphics.drawImage(fixedTemplate, randomX, randomY, null);
|
||||
// backgroundGraphics.rotate(Math.toRadians(-randomDegree + randomDegree2), randomX + fixedTemplate.getWidth(), rotatePosRight);
|
||||
// 干扰图
|
||||
backgroundGraphics.drawImage(fixedTemplate, randomObfuscateX, randomObfuscateY, null);
|
||||
|
||||
backgroundGraphics.dispose();
|
||||
|
||||
CaptchaImageUtils.overlayImage(cutImage, activeTemplate, 0, 0);
|
||||
BufferedImage matrixTemplate = CaptchaImageUtils.createTransparentImage(activeTemplate.getWidth(), background.getHeight());
|
||||
CaptchaImageUtils.overlayImage(matrixTemplate, cutImage, 0, randomY);
|
||||
|
||||
|
||||
FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\Thinkpad\\Desktop\\captcha\\temp\\1\\test-bg" + UUID.randomUUID().toString()
|
||||
+ ".jpg");
|
||||
ImageIO.write(background, "jpg", fileOutputStream);
|
||||
fileOutputStream.close();
|
||||
|
||||
// FileOutputStream fileOutputStream2 = new FileOutputStream("C:\\Users\\Thinkpad\\Desktop\\captcha\\temp\\test-slider.png");
|
||||
// ImageIO.write(matrixTemplate, "png", fileOutputStream2);
|
||||
// fileOutputStream2.close();
|
||||
|
||||
|
||||
System.out.println("randomX=" + randomX);
|
||||
System.out.println("randomY=" + randomY);
|
||||
// System.out.println("randomDegree=" + randomDegree);
|
||||
System.out.println("randomObfuscateX=" + randomObfuscateX);
|
||||
System.out.println("randomObfuscateY=" + randomY);
|
||||
|
||||
|
||||
// CaptchaImageUtils.overlayImage(background, fixedTemplate, randomX, randomY);
|
||||
//
|
||||
// BufferedImage matrixTemplate = CaptchaImageUtils.createTransparentImage(activeTemplate.getWidth(), background.getHeight());
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected double randomDegree(double hypotenuse, double adjacent) {
|
||||
if (hypotenuse <= adjacent) {
|
||||
return 90.0;
|
||||
}
|
||||
// 使用勾股定理计算对边的长度
|
||||
double opposite = Math.sqrt(hypotenuse * hypotenuse - adjacent * adjacent);
|
||||
|
||||
// 使用Math.atan2计算角度(以弧度为单位)
|
||||
double angleInRadians = Math.atan2(opposite, adjacent);
|
||||
|
||||
// 将弧度转换为度
|
||||
double angleInDegrees = Math.toDegrees(angleInRadians);
|
||||
|
||||
return angleInDegrees;
|
||||
}
|
||||
|
||||
protected int randomObfuscateX(int sliderX, int slWidth, int bgWidth) {
|
||||
if (bgWidth / 2 > (sliderX + (slWidth / 2))) {
|
||||
// 右边混淆
|
||||
return randomInt(sliderX + 10, bgWidth - slWidth);
|
||||
}
|
||||
// 左边混淆
|
||||
return randomInt(10, sliderX - slWidth);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ImageCaptchaInfo doWrapImageCaptchaInfo(CaptchaExchange captchaExchange) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化默认资源
|
||||
*/
|
||||
public void initDefaultResource() {
|
||||
ResourceStore resourceStore = imageCaptchaResourceManager.getResourceStore();
|
||||
// 添加一些系统的资源文件
|
||||
resourceStore.addResource(CaptchaTypeConstant.SLIDER, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_RESOURCE_PATH.concat("/1.jpg"), DEFAULT_TAG));
|
||||
|
||||
// 添加一些系统的 模板文件
|
||||
ResourceMap template1 = new ResourceMap(DEFAULT_TAG, 4);
|
||||
template1.put(TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/active.png")));
|
||||
template1.put(TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/1/fixed.png")));
|
||||
resourceStore.addTemplate(CaptchaTypeConstant.SLIDER, template1);
|
||||
|
||||
ResourceMap template2 = new ResourceMap(DEFAULT_TAG, 4);
|
||||
template2.put(TEMPLATE_ACTIVE_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/2/active.png")));
|
||||
template2.put(TEMPLATE_FIXED_IMAGE_NAME, new Resource(ClassPathResourceProvider.NAME, DEFAULT_SLIDER_IMAGE_TEMPLATE_PATH.concat("/2/fixed.png")));
|
||||
resourceStore.addTemplate(CaptchaTypeConstant.SLIDER, template2);
|
||||
}
|
||||
}
|
||||
+7
@@ -4,6 +4,7 @@ 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.*;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import cloud.tianai.captcha.resource.ResourceStore;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.Resource;
|
||||
@@ -33,6 +34,12 @@ public class StandardConcatImageCaptchaGenerator extends AbstractImageCaptchaGen
|
||||
setImageTransform(imageTransform);
|
||||
}
|
||||
|
||||
public StandardConcatImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor) {
|
||||
super(imageCaptchaResourceManager);
|
||||
setImageTransform(imageTransform);
|
||||
setInterceptor(interceptor);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doInit(boolean initDefaultResource) {
|
||||
if (initDefaultResource) {
|
||||
|
||||
+6
@@ -6,6 +6,7 @@ import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator;
|
||||
import cloud.tianai.captcha.generator.ImageTransform;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.*;
|
||||
import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import cloud.tianai.captcha.resource.ResourceStore;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.Resource;
|
||||
@@ -41,6 +42,11 @@ public class StandardRotateImageCaptchaGenerator extends AbstractImageCaptchaGen
|
||||
setImageTransform(imageTransform);
|
||||
}
|
||||
|
||||
public StandardRotateImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor) {
|
||||
super(imageCaptchaResourceManager);
|
||||
setImageTransform(imageTransform);
|
||||
setInterceptor(interceptor);
|
||||
}
|
||||
@Override
|
||||
protected void doInit(boolean initDefaultResource) {
|
||||
if (initDefaultResource) {
|
||||
|
||||
+8
@@ -5,6 +5,7 @@ import cloud.tianai.captcha.generator.AbstractImageCaptchaGenerator;
|
||||
import cloud.tianai.captcha.generator.ImageTransform;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.*;
|
||||
import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import cloud.tianai.captcha.resource.ResourceStore;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.Resource;
|
||||
@@ -48,6 +49,13 @@ public class StandardSliderImageCaptchaGenerator extends AbstractImageCaptchaGen
|
||||
setImageTransform(imageTransform);
|
||||
}
|
||||
|
||||
public StandardSliderImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor) {
|
||||
super(imageCaptchaResourceManager);
|
||||
setImageTransform(imageTransform);
|
||||
setInterceptor(interceptor);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void doInit(boolean initDefaultResource) {
|
||||
if (initDefaultResource) {
|
||||
|
||||
+11
-1
@@ -7,6 +7,7 @@ import cloud.tianai.captcha.generator.ImageTransform;
|
||||
import cloud.tianai.captcha.generator.common.FontWrapper;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.*;
|
||||
import cloud.tianai.captcha.generator.common.util.CaptchaImageUtils;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
import cloud.tianai.captcha.resource.ResourceStore;
|
||||
import cloud.tianai.captcha.resource.common.model.dto.Resource;
|
||||
@@ -78,12 +79,21 @@ public class StandardWordClickImageCaptchaGenerator extends AbstractClickImageCa
|
||||
setImageTransform(imageTransform);
|
||||
}
|
||||
|
||||
public StandardWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform, List<FontWrapper> fonts) {
|
||||
|
||||
public StandardWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor) {
|
||||
super(imageCaptchaResourceManager);
|
||||
setImageTransform(imageTransform);
|
||||
setInterceptor(interceptor);
|
||||
}
|
||||
|
||||
public StandardWordClickImageCaptchaGenerator(ImageCaptchaResourceManager imageCaptchaResourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor, List<FontWrapper> fonts) {
|
||||
super(imageCaptchaResourceManager);
|
||||
setImageTransform(imageTransform);
|
||||
setInterceptor(interceptor);
|
||||
this.fonts = fonts;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected List<Resource> randomGetClickImgTips(GenerateParam param) {
|
||||
int tipSize = interferenceCount + checkClickCount;
|
||||
|
||||
+72
-81
@@ -1,83 +1,74 @@
|
||||
package cloud.tianai.captcha.generator.impl;
|
||||
|
||||
import cloud.tianai.captcha.common.exception.ImageCaptchaException;
|
||||
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
|
||||
import cloud.tianai.captcha.generator.ImageCaptchaPostProcessor;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.CaptchaExchange;
|
||||
import cloud.tianai.captcha.generator.common.model.dto.ImageCaptchaInfo;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author: 天爱有情
|
||||
* @date 2023/4/24 15:23
|
||||
* @Description 验证码后处理器管理
|
||||
*/
|
||||
public class StaticCaptchaPostProcessorManager {
|
||||
|
||||
@Getter
|
||||
private static LinkedList<ImageCaptchaPostProcessor> processors = new LinkedList<>();
|
||||
|
||||
public static void add(ImageCaptchaPostProcessor processor) {
|
||||
processors.add(processor);
|
||||
}
|
||||
|
||||
public static void add(Integer index, ImageCaptchaPostProcessor processor) {
|
||||
processors.add(index, processor);
|
||||
}
|
||||
|
||||
public static void addFirst(ImageCaptchaPostProcessor processor) {
|
||||
processors.addFirst(processor);
|
||||
}
|
||||
|
||||
public static void addLast(ImageCaptchaPostProcessor processor) {
|
||||
processors.addLast(processor);
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
processors.clear();
|
||||
}
|
||||
|
||||
public static void add(List<ImageCaptchaPostProcessor> addPostProcessors) {
|
||||
processors.addAll(addPostProcessors);
|
||||
}
|
||||
|
||||
|
||||
public static ImageCaptchaInfo applyPostProcessorBeforeGenerate(CaptchaExchange captchaExchange, ImageCaptchaGenerator context) {
|
||||
for (ImageCaptchaPostProcessor processor : processors) {
|
||||
try {
|
||||
ImageCaptchaInfo imageCaptchaInfo = processor.beforeGenerateCaptchaImage(captchaExchange, context);
|
||||
if (imageCaptchaInfo != null) {
|
||||
return imageCaptchaInfo;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new ImageCaptchaException("apply ImageCaptchaPostProcessor.beforeGenerateCaptchaImage error, [" + processor.getClass() + "]", e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void applyPostProcessorBeforeWrapImageCaptchaInfo(CaptchaExchange captchaExchange, ImageCaptchaGenerator context) {
|
||||
for (ImageCaptchaPostProcessor processor : processors) {
|
||||
try {
|
||||
processor.beforeWrapImageCaptchaInfo(captchaExchange, context);
|
||||
} catch (Exception e) {
|
||||
throw new ImageCaptchaException("apply ImageCaptchaPostProcessor.beforeWrapImageCaptchaInfo error, [" + processor.getClass() + "]", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void applyPostProcessorAfterGenerateCaptchaImage(CaptchaExchange captchaExchange, ImageCaptchaInfo imageCaptchaInfo, ImageCaptchaGenerator context) {
|
||||
for (ImageCaptchaPostProcessor processor : processors) {
|
||||
try {
|
||||
processor.afterGenerateCaptchaImage(captchaExchange, imageCaptchaInfo, context);
|
||||
} catch (Exception e) {
|
||||
throw new ImageCaptchaException("apply ImageCaptchaPostProcessor.afterGenerateCaptchaImage error, [" + processor.getClass() + "]", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//
|
||||
///**
|
||||
// * @Author: 天爱有情
|
||||
// * @date 2023/4/24 15:23
|
||||
// * @Description 验证码后处理器管理
|
||||
// */
|
||||
//public class StaticCaptchaPostProcessorManager {
|
||||
//
|
||||
// @Getter
|
||||
// private static LinkedList<ImageCaptchaPostProcessor> processors = new LinkedList<>();
|
||||
//
|
||||
// public static void add(ImageCaptchaPostProcessor processor) {
|
||||
// processors.add(processor);
|
||||
// }
|
||||
//
|
||||
// public static void add(Integer index, ImageCaptchaPostProcessor processor) {
|
||||
// processors.add(index, processor);
|
||||
// }
|
||||
//
|
||||
// public static void addFirst(ImageCaptchaPostProcessor processor) {
|
||||
// processors.addFirst(processor);
|
||||
// }
|
||||
//
|
||||
// public static void addLast(ImageCaptchaPostProcessor processor) {
|
||||
// processors.addLast(processor);
|
||||
// }
|
||||
//
|
||||
// public static void clear() {
|
||||
// processors.clear();
|
||||
// }
|
||||
//
|
||||
// public static void add(List<ImageCaptchaPostProcessor> addPostProcessors) {
|
||||
// processors.addAll(addPostProcessors);
|
||||
// }
|
||||
//
|
||||
//
|
||||
// public static ImageCaptchaInfo applyPostProcessorBeforeGenerate(CaptchaExchange captchaExchange, ImageCaptchaGenerator context) {
|
||||
// for (ImageCaptchaPostProcessor processor : processors) {
|
||||
// try {
|
||||
// ImageCaptchaInfo imageCaptchaInfo = processor.beforeGenerateCaptchaImage(captchaExchange, context);
|
||||
// if (imageCaptchaInfo != null) {
|
||||
// return imageCaptchaInfo;
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// throw new ImageCaptchaException("apply ImageCaptchaPostProcessor.beforeGenerateCaptchaImage error, [" + processor.getClass() + "]", e);
|
||||
// }
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
//
|
||||
// public static void applyPostProcessorBeforeWrapImageCaptchaInfo(CaptchaExchange captchaExchange, ImageCaptchaGenerator context) {
|
||||
// for (ImageCaptchaPostProcessor processor : processors) {
|
||||
// try {
|
||||
// processor.beforeWrapImageCaptchaInfo(captchaExchange, context);
|
||||
// } catch (Exception e) {
|
||||
// throw new ImageCaptchaException("apply ImageCaptchaPostProcessor.beforeWrapImageCaptchaInfo error, [" + processor.getClass() + "]", e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//
|
||||
// public static void applyPostProcessorAfterGenerateCaptchaImage(CaptchaExchange captchaExchange, ImageCaptchaInfo imageCaptchaInfo, ImageCaptchaGenerator context) {
|
||||
// for (ImageCaptchaPostProcessor processor : processors) {
|
||||
// try {
|
||||
// processor.afterGenerateCaptchaImage(captchaExchange, imageCaptchaInfo, context);
|
||||
// } catch (Exception e) {
|
||||
// throw new ImageCaptchaException("apply ImageCaptchaPostProcessor.afterGenerateCaptchaImage error, [" + processor.getClass() + "]", e);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
|
||||
+3
-2
@@ -3,6 +3,7 @@ package cloud.tianai.captcha.generator.impl.provider;
|
||||
import cloud.tianai.captcha.generator.ImageCaptchaGenerator;
|
||||
import cloud.tianai.captcha.generator.ImageCaptchaGeneratorProvider;
|
||||
import cloud.tianai.captcha.generator.ImageTransform;
|
||||
import cloud.tianai.captcha.interceptor.CaptchaInterceptor;
|
||||
import cloud.tianai.captcha.resource.ImageCaptchaResourceManager;
|
||||
|
||||
public class CommonImageCaptchaGeneratorProvider implements ImageCaptchaGeneratorProvider {
|
||||
@@ -17,8 +18,8 @@ public class CommonImageCaptchaGeneratorProvider implements ImageCaptchaGenerato
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform) {
|
||||
return provider.get(resourceManager, imageTransform);
|
||||
public ImageCaptchaGenerator get(ImageCaptchaResourceManager resourceManager, ImageTransform imageTransform, CaptchaInterceptor interceptor) {
|
||||
return provider.get(resourceManager, imageTransform,interceptor);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user