mirror of
https://github.com/dromara/tianai-captcha.git
synced 2026-05-07 06:04:34 +08:00
+ 加入混淆滑块凹槽
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
+34
-12
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 百分比对比
|
* 百分比对比
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user