diff --git a/pom.xml b/pom.xml
index 1023a13..57ca940 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
cloud.tianai.captcha
tianai-captcha
- 1.2.3
+ 1.2.4
tianai-captcha
滑块验证码
diff --git a/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java
index 1319c3c..af825ab 100644
--- a/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java
+++ b/src/main/java/cloud/tianai/captcha/template/slider/CacheSliderCaptchaTemplate.java
@@ -104,6 +104,10 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
return target.getSlideImageInfo(targetFormatName, matrixFormatName);
}
+ @Override
+ public SliderCaptchaInfo getSlideImageInfo(GenerateParam param) {
+ return target.getSlideImageInfo(param);
+ }
@Override
public boolean percentageContrast(Float newPercentage, Float oriPercentage) {
diff --git a/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java
index cda2622..b205d4b 100644
--- a/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java
+++ b/src/main/java/cloud/tianai/captcha/template/slider/DefaultSliderCaptchaTemplate.java
@@ -87,8 +87,21 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
@SneakyThrows
@Override
- public SliderCaptchaInfo getSlideImageInfo(String targetFormatName, String matrixFormatName) {
+ public SliderCaptchaInfo getSlideImageInfo(String backgroundFormatName, String sliderFormatName) {
+ return getSlideImageInfo(GenerateParam.builder()
+ .backgroundFormatName(backgroundFormatName)
+ .sliderFormatName(sliderFormatName)
+ .obfuscate(true)
+ .build());
+ }
+ @SneakyThrows
+ @Override
+ public SliderCaptchaInfo getSlideImageInfo(GenerateParam param) {
+
+ String backgroundFormatName = param.getBackgroundFormatName();
+ String sliderFormatName = param.getSliderFormatName();
+ Boolean obfuscate = param.getObfuscate();
Map templateImages = sliderCaptchaResourceManager.randomGetTemplate();
if (templateImages == null || templateImages.isEmpty()) {
@@ -97,7 +110,6 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
Collection inputStreams = new LinkedList<>();
try {
Resource resourceImage = sliderCaptchaResourceManager.randomGetResource();
-
InputStream resourceInputStream = sliderCaptchaResourceManager.getResourceInputStream(resourceImage);
inputStreams.add(resourceInputStream);
BufferedImage cutBackground = wrapFile2BufferedImage(resourceInputStream);
@@ -124,14 +136,19 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight());
coverImage(targetBackground, fixedTemplate, randomX, randomY);
+ if (obfuscate) {
+ // 加入混淆滑块
+ int obfuscateX = randomObfuscateX(randomX, fixedTemplate.getWidth(), targetBackground.getWidth());
+ coverImage(targetBackground, fixedTemplate, obfuscateX, randomY);
+ }
BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
coverImage(cutImage, activeTemplate, 0, 0);
coverImage(matrixTemplate, cutImage, 0, randomY);
// 计算滑块百分比
Float xPercent = (float) randomX / targetBackground.getWidth();
- String backGroundImageBase64 = transformBase64(targetBackground, targetFormatName);
- String sliderImageBase64 = transformBase64(matrixTemplate, matrixFormatName);
+ String backGroundImageBase64 = transformBase64(targetBackground, backgroundFormatName);
+ String sliderImageBase64 = transformBase64(matrixTemplate, sliderFormatName);
return SliderCaptchaInfo.of(randomX, xPercent, randomY, backGroundImageBase64, sliderImageBase64);
} finally {
@@ -146,6 +163,15 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
}
}
+ private int randomObfuscateX(int sliderX, int slWidth, int bgWidth) {
+ if (bgWidth / 2 > (sliderX + (slWidth / 2))) {
+ // 右边混淆
+ return ThreadLocalRandom.current().nextInt( sliderX + slWidth, bgWidth - slWidth);
+ }
+ // 左边混淆
+ return ThreadLocalRandom.current().nextInt(slWidth, sliderX - slWidth);
+ }
+
/**
* 百分比对比
*
@@ -172,15 +198,11 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
}
- private String transformBase64(BufferedImage bufferedImage, String formatName) {
- byte[] data = null;
- try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
- ImageIO.write(bufferedImage, formatName, byteArrayOutputStream);
- //转换成字节码
- data = byteArrayOutputStream.toByteArray();
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
+ private String transformBase64(BufferedImage bufferedImage, String formatName) throws IOException {
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ ImageIO.write(bufferedImage, formatName, byteArrayOutputStream);
+ //转换成字节码
+ byte[] data = byteArrayOutputStream.toByteArray();
String base64 = Base64.getEncoder().encodeToString(data);
return "data:image/" + formatName + ";base64,".concat(base64);
}
@@ -358,7 +380,7 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
slideImageInfo.getSliderImage();
// 获取滑块被背景图片的百分比, (校验图片使用)
Float xPercent = slideImageInfo.getXPercent();
-
+ System.out.println(backgroundImage);
System.out.println(slideImageInfo);
}
}
diff --git a/src/main/java/cloud/tianai/captcha/template/slider/GenerateParam.java b/src/main/java/cloud/tianai/captcha/template/slider/GenerateParam.java
new file mode 100644
index 0000000..80f10ce
--- /dev/null
+++ b/src/main/java/cloud/tianai/captcha/template/slider/GenerateParam.java
@@ -0,0 +1,24 @@
+package cloud.tianai.captcha.template.slider;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: 天爱有情
+ * @date 2022/2/11 9:44
+ * @Description 生成参数
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class GenerateParam {
+ /** 背景格式化名称.*/
+ private String backgroundFormatName;
+ /** 滑块格式化名称.*/
+ private String sliderFormatName;
+ /** 是否混淆.*/
+ private Boolean obfuscate;
+}
diff --git a/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaTemplate.java b/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaTemplate.java
index 7092b44..c93e09c 100644
--- a/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaTemplate.java
+++ b/src/main/java/cloud/tianai/captcha/template/slider/SliderCaptchaTemplate.java
@@ -24,6 +24,14 @@ public interface SliderCaptchaTemplate {
*/
SliderCaptchaInfo getSlideImageInfo(String targetFormatName, String matrixFormatName);
+ /**
+ * 获取滑块验证码
+ *
+ * @param param 生成参数
+ * @return SliderCaptchaInfo
+ */
+ SliderCaptchaInfo getSlideImageInfo(GenerateParam param);
+
/**
* 百分比对比
*