From e914b2f4b24be263530f96af3dabd4d0e4e67587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E7=88=B1=E6=9C=89=E6=83=85?= Date: Fri, 11 Feb 2022 10:39:43 +0800 Subject: [PATCH] =?UTF-8?q?+=20=E5=8A=A0=E5=85=A5=E6=B7=B7=E6=B7=86?= =?UTF-8?q?=E6=BB=91=E5=9D=97=E5=87=B9=E6=A7=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../slider/CacheSliderCaptchaTemplate.java | 4 ++ .../slider/DefaultSliderCaptchaTemplate.java | 50 +++++++++++++------ .../template/slider/GenerateParam.java | 24 +++++++++ .../slider/SliderCaptchaTemplate.java | 8 +++ 5 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 src/main/java/cloud/tianai/captcha/template/slider/GenerateParam.java 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); + /** * 百分比对比 *