From a323c2b262d9182aef1c3a4129a7a41023a0f230 Mon Sep 17 00:00:00 2001 From: chxlay Date: Tue, 11 Nov 2025 14:55:12 +0800 Subject: [PATCH] =?UTF-8?q?-=201=E3=80=81=E5=A2=9E=E5=8A=A0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E7=B1=BB=20StoreCacheKeyPrefix=EF=BC=8C=E7=94=A8?= =?UTF-8?q?=E4=BA=8E=E5=A4=84=E7=90=86=20DefaultImageCaptchaApplication=20?= =?UTF-8?q?=E7=9A=84=E7=BC=93=E5=AD=98=20key=20=E5=A4=84=E7=90=86=20-=202?= =?UTF-8?q?=E3=80=81DefaultImageCaptchaApplication=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E7=BC=93=E5=AD=98=20key=20=E5=A4=84=E7=90=86=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=20=E6=8E=A5=E5=8F=A3=EF=BC=8C=E4=BE=BF=E4=BA=8E?= =?UTF-8?q?=E6=89=A9=E5=B1=95=E4=BD=BF=E7=94=A8=20-=203=E3=80=81DefaultIma?= =?UTF-8?q?geCaptchaApplication=E7=9A=84=E6=9E=84=E5=BB=BA=E5=99=A8=20TACB?= =?UTF-8?q?uilder=20=E4=B8=AD=E5=A2=9E=E5=8A=A0=E5=AF=B9=20StoreCacheKeyPr?= =?UTF-8?q?efix=20=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultImageCaptchaApplication.java | 11 +++++--- .../captcha/application/TACBuilder.java | 9 ++++++- .../captcha/cache/StoreCacheKeyPrefix.java | 26 +++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 tianai-captcha/src/main/java/cloud/tianai/captcha/cache/StoreCacheKeyPrefix.java diff --git a/tianai-captcha/src/main/java/cloud/tianai/captcha/application/DefaultImageCaptchaApplication.java b/tianai-captcha/src/main/java/cloud/tianai/captcha/application/DefaultImageCaptchaApplication.java index a9947c5..41b8fd8 100644 --- a/tianai-captcha/src/main/java/cloud/tianai/captcha/application/DefaultImageCaptchaApplication.java +++ b/tianai-captcha/src/main/java/cloud/tianai/captcha/application/DefaultImageCaptchaApplication.java @@ -2,6 +2,7 @@ package cloud.tianai.captcha.application; import cloud.tianai.captcha.application.vo.ImageCaptchaVO; import cloud.tianai.captcha.cache.CacheStore; +import cloud.tianai.captcha.cache.StoreCacheKeyPrefix; import cloud.tianai.captcha.common.AnyMap; import cloud.tianai.captcha.common.constant.CaptchaTypeConstant; import cloud.tianai.captcha.common.exception.ImageCaptchaException; @@ -41,6 +42,8 @@ public class DefaultImageCaptchaApplication implements ImageCaptchaApplication { private CacheStore cacheStore; /** 验证码配置属性. */ private final ImageCaptchaProperties prop; + /** 缓存key 前缀处理器. */ + private StoreCacheKeyPrefix storeCacheKeyPrefix; /** 默认的过期时间. */ private long defaultExpire = 20000L; @@ -50,9 +53,10 @@ public class DefaultImageCaptchaApplication implements ImageCaptchaApplication { ImageCaptchaValidator imageCaptchaValidator, CacheStore cacheStore, ImageCaptchaProperties prop, - CaptchaInterceptor captchaInterceptor) { + CaptchaInterceptor captchaInterceptor, + StoreCacheKeyPrefix storeCacheKeyPrefix) { this.prop = prop; - + this.storeCacheKeyPrefix = null != storeCacheKeyPrefix? storeCacheKeyPrefix: StoreCacheKeyPrefix.prefixed(prop.getPrefix()); setImageCaptchaValidator(imageCaptchaValidator); setCacheStore(cacheStore); // 默认过期时间 @@ -235,7 +239,8 @@ public class DefaultImageCaptchaApplication implements ImageCaptchaApplication { } protected String getKey(String id) { - return prop.getPrefix().concat(":").concat(id); + // 改为通过接口扩展 + return storeCacheKeyPrefix.compute(id); } @Override diff --git a/tianai-captcha/src/main/java/cloud/tianai/captcha/application/TACBuilder.java b/tianai-captcha/src/main/java/cloud/tianai/captcha/application/TACBuilder.java index 122d3f4..9f831f4 100644 --- a/tianai-captcha/src/main/java/cloud/tianai/captcha/application/TACBuilder.java +++ b/tianai-captcha/src/main/java/cloud/tianai/captcha/application/TACBuilder.java @@ -1,6 +1,7 @@ package cloud.tianai.captcha.application; import cloud.tianai.captcha.cache.CacheStore; +import cloud.tianai.captcha.cache.StoreCacheKeyPrefix; import cloud.tianai.captcha.cache.impl.LocalCacheStore; import cloud.tianai.captcha.generator.ImageCaptchaGenerator; import cloud.tianai.captcha.generator.ImageTransform; @@ -29,6 +30,7 @@ public class TACBuilder { private ImageCaptchaProperties prop = new ImageCaptchaProperties(); private ResourceStore resourceStore; private ImageTransform imageTransform; + private StoreCacheKeyPrefix cacheKeyPrefix; // private List fontWrappers = new ArrayList<>(); public static TACBuilder builder() { @@ -75,6 +77,10 @@ public class TACBuilder { return this; } + public TACBuilder setCacheKeyPrefix(StoreCacheKeyPrefix cacheKeyPrefix) { + this.cacheKeyPrefix = cacheKeyPrefix; + return this; + } public TACBuilder addFont(Resource resource) { this.addResource(FontCache.FONT_TYPE, resource); return this; @@ -148,7 +154,8 @@ public class TACBuilder { if (interceptor == null) { interceptor = EmptyCaptchaInterceptor.INSTANCE; } - DefaultImageCaptchaApplication application = new DefaultImageCaptchaApplication(generator, validator, cacheStore, prop, interceptor); + // 增加前缀处理接口 + DefaultImageCaptchaApplication application = new DefaultImageCaptchaApplication(generator, validator, cacheStore, prop, interceptor, cacheKeyPrefix); return application; } } diff --git a/tianai-captcha/src/main/java/cloud/tianai/captcha/cache/StoreCacheKeyPrefix.java b/tianai-captcha/src/main/java/cloud/tianai/captcha/cache/StoreCacheKeyPrefix.java new file mode 100644 index 0000000..90f8e60 --- /dev/null +++ b/tianai-captcha/src/main/java/cloud/tianai/captcha/cache/StoreCacheKeyPrefix.java @@ -0,0 +1,26 @@ +package cloud.tianai.captcha.cache; + + +/** + * 验证码缓存Key前缀处理 + * + * @author Alay + * @since 2025-11-11 13:44 + */ +public interface StoreCacheKeyPrefix { + /** + * 缓存Key 计算处理 + * + * @param captchaId 原始验证码Id + * @return 处理后的验证码缓存Key + */ + String compute(String captchaId); + + static StoreCacheKeyPrefix prefixed(String prefix) { + if (prefix == null || prefix.isEmpty()) { + throw new IllegalArgumentException("prefix must not be null or empty"); + } + return captchaId -> prefix.concat(":").concat(captchaId); + } + +}