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>
|
||||
<groupId>cloud.tianai.captcha</groupId>
|
||||
<artifactId>tianai-captcha</artifactId>
|
||||
<version>1.2.3</version>
|
||||
<version>1.2.4</version>
|
||||
|
||||
<name>tianai-captcha</name>
|
||||
<description>滑块验证码</description>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+36
-14
@@ -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<String, Resource> templateImages = sliderCaptchaResourceManager.randomGetTemplate();
|
||||
if (templateImages == null || templateImages.isEmpty()) {
|
||||
@@ -97,7 +110,6 @@ public class DefaultSliderCaptchaTemplate implements SliderCaptchaTemplate {
|
||||
Collection<InputStream> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
/**
|
||||
* 获取滑块验证码
|
||||
*
|
||||
* @param param 生成参数
|
||||
* @return SliderCaptchaInfo
|
||||
*/
|
||||
SliderCaptchaInfo getSlideImageInfo(GenerateParam param);
|
||||
|
||||
/**
|
||||
* 百分比对比
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user