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); + } + +}