U 优化 CacheSliderCaptchaTemplate

U SliderCaptchaValidator 增加 generateSliderCaptchaValidData 方法, 允许用户添加自定义验证参数
U SliderCaptchaValidator.valid 参数修改为由原来的百分比换成map 支持用户自定义参数的透传
U 升级版本 改为1.2.6
This commit is contained in:
天爱有情
2022-02-24 10:18:10 +08:00
parent f4ff605bca
commit 04d149ea05
6 changed files with 72 additions and 14 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId>
<version>1.2.5</version>
<version>1.2.6</version>
<name>tianai-captcha</name>
<description>滑块验证码</description>
+2 -2
View File
@@ -1,4 +1,4 @@
# 这是一个滑块验证码的实现
这是一个滑块验证码的实现
## [在线体验](https://www.tianai.cloud)
## 验证码demo移步 [tianai-captcha-demo](https://gitee.com/tianai/tianai-captcha-demo)
## 不说废话,直接上成品
@@ -21,7 +21,7 @@
<dependency>
<groupId>cloud.tianai.captcha</groupId>
<artifactId>tianai-captcha</artifactId>
<version>1.2.5</version>
<version>1.2.6</version>
</dependency>
```
2. 使用 `SliderCaptchaTemplate`获取滑块验证码
@@ -26,14 +26,17 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
private int waitTime = 1000;
/** 调度器检查缓存的间隔时间. */
private int period = 100;
private GenerateParam generateParam;
public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, int size) {
public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, GenerateParam generateParam, int size) {
this.target = target;
this.generateParam = generateParam;
this.size = size;
}
public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, int size, int waitTime, int period) {
public CacheSliderCaptchaTemplate(SliderCaptchaTemplate target, GenerateParam generateParam, int size, int waitTime, int period) {
this.target = target;
this.generateParam = generateParam;
this.size = size;
this.waitTime = waitTime;
this.period = period;
@@ -57,7 +60,7 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
if (pos.get() >= size) {
return;
}
SliderCaptchaInfo slideImageInfo = target.getSlideImageInfo();
SliderCaptchaInfo slideImageInfo = target.getSlideImageInfo(generateParam);
if (slideImageInfo != null) {
boolean addStatus = queue.offer(slideImageInfo);
if (addStatus) {
@@ -75,7 +78,7 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
sleep();
}
}, 0, period, TimeUnit.MILLISECONDS);
log.info("缓存滑块验证码调度器初始化完成: size:{}", size);
log.info("缓存滑块验证码调度器初始化完成: size:{}, genParam:{}", size, generateParam);
}
private void sleep() {
@@ -90,7 +93,7 @@ public class CacheSliderCaptchaTemplate implements SliderCaptchaTemplate {
public SliderCaptchaInfo getSlideImageInfo() {
SliderCaptchaInfo poll = queue.poll();
if (poll == null) {
log.warn("滑块验证码缓存不足");
log.warn("滑块验证码缓存不足, genParam:{}", generateParam);
// 如果池内没数据, 则直接生成
return target.getSlideImageInfo();
}
@@ -4,6 +4,7 @@ import cloud.tianai.captcha.template.slider.util.CollectionUtils;
import cloud.tianai.captcha.template.slider.util.ObjectUtils;
import java.util.List;
import java.util.Map;
/**
* @Author: 天爱有情
@@ -20,11 +21,11 @@ public class BasicCaptchaTrackValidator extends SimpleSliderCaptchaValidator {
}
@Override
public boolean valid(SliderCaptchaTrack sliderCaptchaTrack, Float oriPercentage) {
public boolean valid(SliderCaptchaTrack sliderCaptchaTrack, Map<String, Object> sliderCaptchaValidData) {
// 校验参数
checkParam(sliderCaptchaTrack);
// 基础校验
boolean superValid = super.valid(sliderCaptchaTrack, oriPercentage);
boolean superValid = super.valid(sliderCaptchaTrack, sliderCaptchaValidData);
if (!superValid) {
return false;
}
@@ -1,15 +1,21 @@
package cloud.tianai.captcha.template.slider.validator;
import cloud.tianai.captcha.template.slider.SliderCaptchaInfo;
import cloud.tianai.captcha.template.slider.util.CollectionUtils;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: 天爱有情
* @date 2022/2/17 11:01
* @Description 基本的滑块验证校验 , 值进行基本校验, 目前只校验用户是否滑动到缺口处,不校验行为轨迹
*/
@Slf4j
public class SimpleSliderCaptchaValidator implements SliderCaptchaValidator {
public static float DEFAULT_TOLERANT = 0.02f;
@@ -48,7 +54,19 @@ public class SimpleSliderCaptchaValidator implements SliderCaptchaValidator {
}
@Override
public boolean valid(SliderCaptchaTrack sliderCaptchaTrack, Float oriPercentage) {
public Map<String, Object> generateSliderCaptchaValidData(SliderCaptchaInfo sliderCaptchaInfo) {
Map<String, Object> map = new HashMap<>(8);
addPercentage(sliderCaptchaInfo, map);
return map;
}
@Override
public boolean valid(SliderCaptchaTrack sliderCaptchaTrack, Map<String, Object> sliderCaptchaValidData) {
Float oriPercentage = getPercentage(sliderCaptchaTrack, sliderCaptchaValidData);
if (oriPercentage == null) {
// 没读取到百分比
return false;
}
Integer bgImageWidth = sliderCaptchaTrack.getBgImageWidth();
if (bgImageWidth == null || bgImageWidth < 1) {
// 没有背景图片宽度
@@ -66,4 +84,28 @@ public class SimpleSliderCaptchaValidator implements SliderCaptchaValidator {
// 校验百分比
return checkPercentage(calcPercentage, oriPercentage);
}
protected Float getPercentage(SliderCaptchaTrack sliderCaptchaTrack, Map<String, Object> sliderCaptchaValidData) {
Object percentage = sliderCaptchaValidData.get("percentage");
if (percentage != null) {
if (percentage instanceof Number) {
return ((Number) percentage).floatValue();
}
try {
if (percentage instanceof String) {
return Float.parseFloat((String) percentage);
}
} catch (NumberFormatException e) {
log.error("从 sliderCaptchaValidData 读取到的 percentage无法转换成float类型, [{}]", percentage);
throw e;
}
}
log.warn("无法从 sliderCaptchaValidData 获取到 percentage");
return null;
}
protected void addPercentage(SliderCaptchaInfo sliderCaptchaInfo, Map<String, Object> sliderCaptchaValidData) {
float percentage = calcPercentage(sliderCaptchaInfo.getX(), sliderCaptchaInfo.getBgImageWidth());
sliderCaptchaValidData.put("percentage", percentage);
}
}
@@ -1,5 +1,9 @@
package cloud.tianai.captcha.template.slider.validator;
import cloud.tianai.captcha.template.slider.SliderCaptchaInfo;
import java.util.Map;
/**
* @Author: 天爱有情
* @date 2022/2/17 10:54
@@ -35,12 +39,20 @@ public interface SliderCaptchaValidator {
*/
boolean checkPercentage(Float newPercentage, Float oriPercentage, float tolerant);
/**
* 用于生成验证码校验时需要的回传参数
*
* @param sliderCaptchaInfo 生成的验证码数据
* @return Map<String, Object>
*/
Map<String, Object> generateSliderCaptchaValidData(SliderCaptchaInfo sliderCaptchaInfo);
/**
* 校验用户滑动滑块是否正确
*
* @param sliderCaptchaTrack 包含了滑动轨迹,展示的图片宽高,滑动时间等参数
* @param oriPercentage 正确的滑块百分比,用作基础校验
* @param sliderCaptchaTrack 包含了滑动轨迹,展示的图片宽高,滑动时间等参数
* @param sliderCaptchaValidData generateSliderCaptchaValidData(生成的数据
* @return boolean
*/
boolean valid(SliderCaptchaTrack sliderCaptchaTrack, Float oriPercentage);
boolean valid(SliderCaptchaTrack sliderCaptchaTrack, Map<String, Object> sliderCaptchaValidData);
}