+ 加入混淆滑块凹槽

This commit is contained in:
天爱有情
2022-02-11 10:39:43 +08:00
parent 78896ea3b3
commit e914b2f4b2
5 changed files with 73 additions and 15 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>cloud.tianai.captcha</groupId> <groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId> <artifactId>tianai-captcha</artifactId>
<version>1.2.3</version> <version>1.2.4</version>
<name>tianai-captcha</name> <name>tianai-captcha</name>
<description>滑块验证码</description> <description>滑块验证码</description>
@@ -104,6 +104,10 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
return target.getSlideImageInfo(targetFormatName, matrixFormatName); return target.getSlideImageInfo(targetFormatName, matrixFormatName);
} }
@Override
public SliderCaptchaInfo getSlideImageInfo(GenerateParam param) {
return target.getSlideImageInfo(param);
}
@Override @Override
public boolean percentageContrast(Float newPercentage, Float oriPercentage) { public boolean percentageContrast(Float newPercentage, Float oriPercentage) {
@@ -87,8 +87,21 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
@SneakyThrows @SneakyThrows
@Override @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<String, Resource> templateImages = sliderCaptchaResourceManager.randomGetTemplate(); Map<String, Resource> templateImages = sliderCaptchaResourceManager.randomGetTemplate();
if (templateImages == null || templateImages.isEmpty()) { if (templateImages == null || templateImages.isEmpty()) {
@@ -97,7 +110,6 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
Collection<InputStream> inputStreams = new LinkedList<>(); Collection<InputStream> inputStreams = new LinkedList<>();
try { try {
Resource resourceImage = sliderCaptchaResourceManager.randomGetResource(); Resource resourceImage = sliderCaptchaResourceManager.randomGetResource();
InputStream resourceInputStream = sliderCaptchaResourceManager.getResourceInputStream(resourceImage); InputStream resourceInputStream = sliderCaptchaResourceManager.getResourceInputStream(resourceImage);
inputStreams.add(resourceInputStream); inputStreams.add(resourceInputStream);
BufferedImage cutBackground = wrapFile2BufferedImage(resourceInputStream); BufferedImage cutBackground = wrapFile2BufferedImage(resourceInputStream);
@@ -124,14 +136,19 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight()); int randomY = ThreadLocalRandom.current().nextInt(targetBackground.getHeight() - fixedTemplate.getHeight());
coverImage(targetBackground, fixedTemplate, randomX, randomY); 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); BufferedImage cutImage = cutImage(cutBackground, fixedTemplate, randomX, randomY);
coverImage(cutImage, activeTemplate, 0, 0); coverImage(cutImage, activeTemplate, 0, 0);
coverImage(matrixTemplate, cutImage, 0, randomY); coverImage(matrixTemplate, cutImage, 0, randomY);
// 计算滑块百分比 // 计算滑块百分比
Float xPercent = (float) randomX / targetBackground.getWidth(); Float xPercent = (float) randomX / targetBackground.getWidth();
String backGroundImageBase64 = transformBase64(targetBackground, targetFormatName); String backGroundImageBase64 = transformBase64(targetBackground, backgroundFormatName);
String sliderImageBase64 = transformBase64(matrixTemplate, matrixFormatName); String sliderImageBase64 = transformBase64(matrixTemplate, sliderFormatName);
return SliderCaptchaInfo.of(randomX, xPercent, randomY, backGroundImageBase64, sliderImageBase64); return SliderCaptchaInfo.of(randomX, xPercent, randomY, backGroundImageBase64, sliderImageBase64);
} finally { } 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) { private String transformBase64(BufferedImage bufferedImage, String formatName) throws IOException {
byte[] data = null; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
ImageIO.write(bufferedImage, formatName, byteArrayOutputStream); ImageIO.write(bufferedImage, formatName, byteArrayOutputStream);
//转换成字节码 //转换成字节码
data = byteArrayOutputStream.toByteArray(); byte[] data = byteArrayOutputStream.toByteArray();
} catch (Exception e) {
System.out.println(e.getMessage());
}
String base64 = Base64.getEncoder().encodeToString(data); String base64 = Base64.getEncoder().encodeToString(data);
return "data:image/" + formatName + ";base64,".concat(base64); return "data:image/" + formatName + ";base64,".concat(base64);
} }
@@ -358,7 +380,7 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
slideImageInfo.getSliderImage(); slideImageInfo.getSliderImage();
// 获取滑块被背景图片的百分比, (校验图片使用) // 获取滑块被背景图片的百分比, (校验图片使用)
Float xPercent = slideImageInfo.getXPercent(); Float xPercent = slideImageInfo.getXPercent();
System.out.println(backgroundImage);
System.out.println(slideImageInfo); System.out.println(slideImageInfo);
} }
} }
@@ -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;
}
@@ -24,6 +24,14 @@ public interface SliderCaptchaTemplate {
*/ */
SliderCaptchaInfo getSlideImageInfo(String targetFormatName, String matrixFormatName); SliderCaptchaInfo getSlideImageInfo(String targetFormatName, String matrixFormatName);
/**
* 获取滑块验证码
*
* @param param 生成参数
* @return SliderCaptchaInfo
*/
SliderCaptchaInfo getSlideImageInfo(GenerateParam param);
/** /**
* 百分比对比 * 百分比对比
* *