From d4f129d66fbe4a61750a9af37174eb794ed09bda Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:00:52 +0800 Subject: [PATCH 01/10] =?UTF-8?q?refactor:=20=E6=B7=BB=E5=8A=A0=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E8=A7=A3=E5=AF=86=E6=9C=8D=E5=8A=A1=E5=92=8C?= =?UTF-8?q?=E5=B7=A5=E5=8E=82=E6=A8=A1=E5=BC=8F=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. **新增常量** - 在 `Const.java` 中新增了 `CAPTCHA_DECRYPT_TYPE` 常量。 2. **重命名与修改接口** - 将 `CaptchaSecureService` 重命名为 `CaptchaDecryptService`,并修改其方法: - `encrypt` 方法删除。 - `decrypt` 方法增加 `throws Exception`。 - 新增 `getType` 方法用于区分解密算法。 3. **抽象服务中集成解密服务** - 在 `AbstractCaptchaService` 中引入 `CaptchaDecryptService`: - 新增 `captchaDecryptService` 私有变量。 - 在 `init` 方法中通过 `CaptchaDecryptServiceFactory` 获取解密服务实例。 - 修改 `decrypt` 方法,使用 `captchaDecryptService` 进行解密。 4. **具体实现中使用解密接口** - 在 `BlockPuzzleCaptchaServiceImpl` 中调用新的 `decrypt` 方法,使用接口解密,支持自定义实现。 5. **创建 AES 解密服务实现** - 新增 `CaptchaAesDecryptService` 类,实现了 `CaptchaDecryptService` 接口,并提供 AES 解密逻辑。 6. **创建解密服务工厂** - 新增 `CaptchaDecryptServiceFactory` 类,根据解密类型返回对应的解密服务实例。 7. **AES 工具类改进** - 在 `AESUtil` 类中,显式抛出更具体的异常类型,并移除不必要的通用 `Exception`。 8. **SPI声明文件更新** - 在 `META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService` 中增加 `CaptchaAesDecryptService` 的声明。 --- .../xingyuv/captcha/model/common/Const.java | 2 ++ .../service/CaptchaDecryptService.java | 17 +++++++++++ .../service/impl/AbstractCaptchaService.java | 10 +++++-- .../impl/BlockPuzzleCaptchaServiceImpl.java | 1 + .../impl/CaptchaAesDecryptService.java | 19 +++++++++++++ .../impl/CaptchaDecryptServiceFactory.java | 28 +++++++++++++++++++ .../com/xingyuv/captcha/util/AESUtil.java | 13 +++++---- ...gyuv.captcha.service.CaptchaDecryptService | 1 + 8 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 core/captcha-plus/src/main/java/com/xingyuv/captcha/service/CaptchaDecryptService.java create mode 100644 core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaAesDecryptService.java create mode 100644 core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java create mode 100644 core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java index 602aa43..e50997f 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java @@ -25,6 +25,8 @@ public interface Const { */ String CAPTCHA_CACHE_TYPE = "captcha.cacheType"; + String CAPTCHA_DECRYPT_TYPE = "captcha.decrypt.type"; + /** * 右下角水印文字(我的水印) */ diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/CaptchaDecryptService.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/CaptchaDecryptService.java new file mode 100644 index 0000000..1af27a6 --- /dev/null +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/CaptchaDecryptService.java @@ -0,0 +1,17 @@ +package com.xingyuv.captcha.service; + +/** + * 用于验证码安全验证 + */ +public interface CaptchaDecryptService { + /** + * 解密 + */ + String decrypt(String point, String key) throws Exception; + + /** + * 用于区别算法,不区分大小写 + * @return + */ + String getType(); +} diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java index 4da93c5..16f213d 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java @@ -11,6 +11,7 @@ import com.xingyuv.captcha.model.common.RepCodeEnum; import com.xingyuv.captcha.model.common.ResponseModel; import com.xingyuv.captcha.model.vo.CaptchaVO; import com.xingyuv.captcha.service.CaptchaCacheService; +import com.xingyuv.captcha.service.CaptchaDecryptService; import com.xingyuv.captcha.service.CaptchaService; import com.xingyuv.captcha.util.*; import org.slf4j.Logger; @@ -25,6 +26,8 @@ import java.util.Base64; import java.util.Objects; import java.util.Properties; +import static com.xingyuv.captcha.model.common.Const.CAPTCHA_DECRYPT_TYPE; + /** * Created by raodeming on 2019/12/25. */ @@ -71,6 +74,8 @@ public abstract class AbstractCaptchaService implements CaptchaService { protected static int captchaInterferenceOptions = 0; + private CaptchaDecryptService captchaDecryptService; + /** * 判断应用是否实现了自定义缓存,没有就使用内存 * @@ -95,6 +100,7 @@ public abstract class AbstractCaptchaService implements CaptchaService { captchaInterferenceOptions = Integer.parseInt( config.getProperty(Const.CAPTCHA_INTERFERENCE_OPTIONS, "0")); + captchaDecryptService = CaptchaDecryptServiceFactory.getDecryptService(config.getProperty(CAPTCHA_DECRYPT_TYPE,"aes")); // 部署在linux中,如果没有安装中文字段,水印和点选文字,中文无法显示, // 通过加载resources下的font字体解决,无需在linux中安装字体 loadWaterMarkFont(); @@ -257,8 +263,8 @@ public abstract class AbstractCaptchaService implements CaptchaService { * @return 前端坐标aes加密 * @throws Exception E */ - public static String decrypt(String point, String key) throws Exception { - return AESUtil.aesDecrypt(point, key); + public String decrypt(String point, String key) throws Exception { + return captchaDecryptService.decrypt(point, key); } protected static int getEnOrChLength(String s) { diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java index 32c9a83..905aefb 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/BlockPuzzleCaptchaServiceImpl.java @@ -99,6 +99,7 @@ public class BlockPuzzleCaptchaServiceImpl extends AbstractCaptchaService { String pointJson = null; try { point = JsonUtil.parseObject(s, PointVO.class); + //将原有的固定 aes 解密过程改为接口解密,支持自定义实现解密流程 //aes解密 pointJson = decrypt(captchaVO.getPointJson(), point.getSecretKey()); point1 = JsonUtil.parseObject(pointJson, PointVO.class); diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaAesDecryptService.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaAesDecryptService.java new file mode 100644 index 0000000..0ead5da --- /dev/null +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaAesDecryptService.java @@ -0,0 +1,19 @@ +package com.xingyuv.captcha.service.impl; + +import com.xingyuv.captcha.service.CaptchaDecryptService; +import com.xingyuv.captcha.util.AESUtil; + +/** + * AES 解密 + */ +public class CaptchaAesDecryptService implements CaptchaDecryptService { + @Override + public String decrypt(String point, String key) throws Exception { + return AESUtil.aesDecrypt(point, key); + } + + @Override + public String getType() { + return "AES"; + } +} diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java new file mode 100644 index 0000000..d6861cb --- /dev/null +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java @@ -0,0 +1,28 @@ +package com.xingyuv.captcha.service.impl; + +import com.xingyuv.captcha.service.CaptchaDecryptService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.ServiceLoader; + +public class CaptchaDecryptServiceFactory { + private static final Logger log = LoggerFactory.getLogger(CaptchaDecryptServiceFactory.class); + private static final Map DECRYPT_SERVICE_HASH_MAP = new HashMap<>(); + + static { + ServiceLoader decryptServices = ServiceLoader.load(CaptchaDecryptService.class); + for (CaptchaDecryptService decryptService : decryptServices) { + DECRYPT_SERVICE_HASH_MAP.put(decryptService.getType().toLowerCase(Locale.ROOT), decryptService); + } + log.debug("supported-captchaDecrypt-service:{}", DECRYPT_SERVICE_HASH_MAP.keySet()); + + } + + public static CaptchaDecryptService getDecryptService(String type) { + return DECRYPT_SERVICE_HASH_MAP.get(type); + } +} diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java index ecf695b..eea71f6 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/util/AESUtil.java @@ -7,11 +7,12 @@ package com.xingyuv.captcha.util; -import javax.crypto.Cipher; -import javax.crypto.KeyGenerator; +import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.math.BigInteger; import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.Base64; public class AESUtil { @@ -57,9 +58,8 @@ public class AESUtil { * * @param base64Code 待解码的base 64 code * @return 解码后的byte[] - * @throws Exception e */ - public static byte[] base64Decode(String base64Code) throws Exception { + public static byte[] base64Decode(String base64Code) { Base64.Decoder decoder = Base64.getDecoder(); return StringUtils.isEmpty(base64Code) ? null : decoder.decode(base64Code); } @@ -106,7 +106,8 @@ public class AESUtil { * @return 解密后的String * @throws Exception e */ - public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception { + + public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); @@ -125,7 +126,7 @@ public class AESUtil { * @return 解密后的string * @throws Exception e */ - public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception { + public static String aesDecrypt(String encryptStr, String decryptKey) throws IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException, NoSuchAlgorithmException, InvalidKeyException { if (StringUtils.isBlank(decryptKey)) { return encryptStr; } diff --git a/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService b/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService new file mode 100644 index 0000000..25da074 --- /dev/null +++ b/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService @@ -0,0 +1 @@ +com.xingyuv.captcha.service.impl.CaptchaAesDecryptService \ No newline at end of file -- Gitee From 2143440a45f03762b01065950ab0e48b8489f36f Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:03:18 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E6=9C=8D=E5=8A=A1=E5=B7=A5=E5=8E=82=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E5=86=99=E4=B8=8D=E6=95=8F=E6=84=9F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. **修正解密服务工厂** - 在 `CaptchaDecryptServiceFactory.java` 中,调整 `getDecryptService` 方法,使其参数在查找时忽略大小写: ```java return DECRYPT_SERVICE_HASH_MAP.get(type.toLowerCase(Locale.ROOT)); ``` --- .../captcha/service/impl/CaptchaDecryptServiceFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java index d6861cb..8e767e4 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaDecryptServiceFactory.java @@ -23,6 +23,6 @@ public class CaptchaDecryptServiceFactory { } public static CaptchaDecryptService getDecryptService(String type) { - return DECRYPT_SERVICE_HASH_MAP.get(type); + return DECRYPT_SERVICE_HASH_MAP.get(type.toLowerCase(Locale.ROOT)); } } -- Gitee From 70e68394f3804fd99f41c0bb3af3e521a50f5a92 Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:18:08 +0800 Subject: [PATCH 03/10] =?UTF-8?q?test:=20=E6=B7=BB=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E6=9C=8D=E5=8A=A1=E5=B7=A5=E5=8E=82=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. **增强单元测试** - 在 `CaptchaDecryptServiceTest.java` 中新增对解密服务工厂的单元测试,验证不同类型的解密服务实例获取: - 添加对自定义解密方法的单元测试,验证解密行为和异常处理: --- .../util/CaptchaDecryptServiceTest.java | 26 +++++++++++++++++++ .../util/CaptchaTestDecryptService.java | 24 +++++++++++++++++ ...gyuv.captcha.service.CaptchaDecryptService | 2 ++ 3 files changed, 52 insertions(+) create mode 100644 core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java create mode 100644 core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaTestDecryptService.java create mode 100644 core/captcha-plus/src/test/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService diff --git a/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java b/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java new file mode 100644 index 0000000..937a820 --- /dev/null +++ b/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java @@ -0,0 +1,26 @@ +package com.xingyuv.captcha.util; + +import com.xingyuv.captcha.service.CaptchaDecryptService; +import com.xingyuv.captcha.service.impl.CaptchaDecryptServiceFactory; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CaptchaDecryptServiceTest { + @Test + void testGetInstance() { + CaptchaDecryptService aes = CaptchaDecryptServiceFactory.getDecryptService("AES"); + assertNotNull(aes); + CaptchaDecryptService test = CaptchaDecryptServiceFactory.getDecryptService("test"); + assertNotNull(test); + } + + @Test + void testCustomDecrypt() throws Exception { + CaptchaDecryptService test = CaptchaDecryptServiceFactory.getDecryptService("test"); + assertEquals(test.decrypt("test", null), ""); + assertThrows(NullPointerException.class, () -> test.decrypt(null, "")); + assertThrows(Exception.class, () -> test.decrypt("", "")); + } + +} diff --git a/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaTestDecryptService.java b/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaTestDecryptService.java new file mode 100644 index 0000000..d8c499c --- /dev/null +++ b/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaTestDecryptService.java @@ -0,0 +1,24 @@ +package com.xingyuv.captcha.util; + +import com.xingyuv.captcha.service.CaptchaDecryptService; + +import java.util.Objects; + +/** + * 测试解密 + */ +public class CaptchaTestDecryptService implements CaptchaDecryptService { + @Override + public String decrypt(String point, String key) throws Exception { + Objects.requireNonNull(point); + if (key!=null) { + throw new Exception(); + } + return ""; + } + + @Override + public String getType() { + return "TEST"; + } +} diff --git a/core/captcha-plus/src/test/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService b/core/captcha-plus/src/test/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService new file mode 100644 index 0000000..e0aeb2f --- /dev/null +++ b/core/captcha-plus/src/test/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService @@ -0,0 +1,2 @@ +com.xingyuv.captcha.service.impl.CaptchaAesDecryptService +com.xingyuv.captcha.util.CaptchaTestDecryptService -- Gitee From 1f8b23145e3e90c9ea64f8dc878fa3a5f457f72a Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:31:15 +0800 Subject: [PATCH 04/10] =?UTF-8?q?refactor:=20=E6=A0=87=E8=AE=B0=20AES=20?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=BC=80=E5=85=B3=E4=B8=BA=E5=BA=9F=E5=BC=83?= =?UTF-8?q?=E5=B9=B6=E8=87=AA=E5=8A=A8=E5=90=AF=E7=94=A8=20AES=20=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. **标记 AES 加密开关常量为废弃,无需使用** 2. **自动启用 AES 解密模式** - 删除了对 `CAPTCHA_AES_STATUS` 的读取和解析,并在解密类型为 `AES` 时,自动设置 `captchaAesStatus` 为 `true`。 --- .../main/java/com/xingyuv/captcha/model/common/Const.java | 2 ++ .../xingyuv/captcha/service/impl/AbstractCaptchaService.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java index e50997f..6992584 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/model/common/Const.java @@ -61,7 +61,9 @@ public interface Const { /** * aes加密开关 + * @deprecated 不再需要这个参数,当解密算法为 AES 时,会自动开启加密开关 */ + @Deprecated String CAPTCHA_AES_STATUS = "captcha.aes.status"; /** diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java index 16f213d..53b916b 100644 --- a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/AbstractCaptchaService.java @@ -93,14 +93,15 @@ public abstract class AbstractCaptchaService implements CaptchaService { waterMark = config.getProperty(Const.CAPTCHA_WATER_MARK, waterMark); slipOffset = config.getProperty(Const.CAPTCHA_SLIP_OFFSET, slipOffset); waterMarkFontStr = config.getProperty(Const.CAPTCHA_WATER_FONT, clickWordFontStr); - captchaAesStatus = Boolean.parseBoolean(config.getProperty(Const.CAPTCHA_AES_STATUS, "true")); clickWordFontStr = config.getProperty(Const.CAPTCHA_FONT_TYPE, clickWordFontStr); //clickWordFontStr = config.getProperty(Const.CAPTCHA_FONT_TYPE, "SourceHanSansCN-Normal.otf"); cacheType = config.getProperty(Const.CAPTCHA_CACHE_TYPE, cacheType); captchaInterferenceOptions = Integer.parseInt( config.getProperty(Const.CAPTCHA_INTERFERENCE_OPTIONS, "0")); - captchaDecryptService = CaptchaDecryptServiceFactory.getDecryptService(config.getProperty(CAPTCHA_DECRYPT_TYPE,"aes")); + String decryptType = config.getProperty(CAPTCHA_DECRYPT_TYPE, "aes"); + captchaAesStatus = decryptType.equalsIgnoreCase("aes"); + captchaDecryptService = CaptchaDecryptServiceFactory.getDecryptService(decryptType); // 部署在linux中,如果没有安装中文字段,水印和点选文字,中文无法显示, // 通过加载resources下的font字体解决,无需在linux中安装字体 loadWaterMarkFont(); -- Gitee From aa43a05897c6622e11d91639dc6b74441dd87df8 Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:35:28 +0800 Subject: [PATCH 05/10] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=A3?= =?UTF-8?q?=E5=AF=86=E7=B1=BB=E5=9E=8B=E9=85=8D=E7=BD=AE=E5=88=B0=20Spring?= =?UTF-8?q?=20Boot=20Starter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. **更新自动配置类** 2. **更新属性类** - 更新了 `toString` 方法以包含 `decryptType` 字段: --- .../AjCaptchaServiceAutoConfiguration.java | 1 + .../captcha/properties/AjCaptchaProperties.java | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/config/AjCaptchaServiceAutoConfiguration.java b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/config/AjCaptchaServiceAutoConfiguration.java index d6f9869..b182b99 100644 --- a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/config/AjCaptchaServiceAutoConfiguration.java +++ b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/config/AjCaptchaServiceAutoConfiguration.java @@ -35,6 +35,7 @@ public class AjCaptchaServiceAutoConfiguration { config.put(Const.ORIGINAL_PATH_PIC_CLICK, prop.getPicClick()); config.put(Const.CAPTCHA_SLIP_OFFSET, prop.getSlipOffset()); config.put(Const.CAPTCHA_AES_STATUS, String.valueOf(prop.getAesStatus())); + config.put(Const.CAPTCHA_DECRYPT_TYPE, prop.getDecryptType()); config.put(Const.CAPTCHA_WATER_FONT, prop.getWaterFont()); config.put(Const.CAPTCHA_CACHE_MAX_NUMBER, prop.getCacheNumber()); config.put(Const.CAPTCHA_TIMING_CLEAR_SECOND, prop.getTimingClear()); diff --git a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java index 313f471..3de6714 100644 --- a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java +++ b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java @@ -113,6 +113,8 @@ public class AjCaptchaProperties { */ private int clickWordCount = 4; + private String decryptType; + public int getFontStyle() { return fontStyle; } @@ -312,9 +314,17 @@ public class AjCaptchaProperties { this.timingClear = timingClear; } + public String getDecryptType() { + return decryptType; + } + + public void setDecryptType(String decryptType) { + this.decryptType = decryptType; + } + @Override public String toString() { - return "\nAjCaptchaProperties{" + + return "AjCaptchaProperties{" + "type=" + type + ", jigsaw='" + jigsaw + '\'' + ", picClick='" + picClick + '\'' + @@ -327,12 +337,17 @@ public class AjCaptchaProperties { ", cacheNumber='" + cacheNumber + '\'' + ", timingClear='" + timingClear + '\'' + ", cacheType=" + cacheType + + ", historyDataClearEnable=" + historyDataClearEnable + ", reqFrequencyLimitEnable=" + reqFrequencyLimitEnable + ", reqGetLockLimit=" + reqGetLockLimit + ", reqGetLockSeconds=" + reqGetLockSeconds + ", reqGetMinuteLimit=" + reqGetMinuteLimit + ", reqCheckMinuteLimit=" + reqCheckMinuteLimit + ", reqVerifyMinuteLimit=" + reqVerifyMinuteLimit + + ", fontStyle=" + fontStyle + + ", fontSize=" + fontSize + + ", clickWordCount=" + clickWordCount + + ", decryptType='" + decryptType + '\'' + '}'; } } -- Gitee From 6370b4bbb6d31f3763104e55d9ab02719556e73b Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:42:19 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/captcha-plus/pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/captcha-plus/pom.xml b/core/captcha-plus/pom.xml index 2338436..c03a410 100644 --- a/core/captcha-plus/pom.xml +++ b/core/captcha-plus/pom.xml @@ -39,7 +39,12 @@ 1.7.36 provided - + + org.junit.jupiter + junit-jupiter + 5.10.2 + test + -- Gitee From 4956f59377f84eb59d42cf3696b0a2551177f59b Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:50:09 +0800 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=97=A0?= =?UTF-8?q?=E9=9C=80=E8=A7=A3=E5=AF=86=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CaptchaBlankDecryptService.java | 18 ++++++++++++++++++ ...ngyuv.captcha.service.CaptchaDecryptService | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaBlankDecryptService.java diff --git a/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaBlankDecryptService.java b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaBlankDecryptService.java new file mode 100644 index 0000000..2a53400 --- /dev/null +++ b/core/captcha-plus/src/main/java/com/xingyuv/captcha/service/impl/CaptchaBlankDecryptService.java @@ -0,0 +1,18 @@ +package com.xingyuv.captcha.service.impl; + +import com.xingyuv.captcha.service.CaptchaDecryptService; + +/** + * 无需解密 + */ +public class CaptchaBlankDecryptService implements CaptchaDecryptService { + @Override + public String decrypt(String point, String key) throws Exception { + return point; + } + + @Override + public String getType() { + return "blank"; + } +} diff --git a/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService b/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService index 25da074..d13908e 100644 --- a/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService +++ b/core/captcha-plus/src/main/resources/META-INF/services/com.xingyuv.captcha.service.CaptchaDecryptService @@ -1 +1,2 @@ -com.xingyuv.captcha.service.impl.CaptchaAesDecryptService \ No newline at end of file +com.xingyuv.captcha.service.impl.CaptchaAesDecryptService +com.xingyuv.captcha.service.impl.CaptchaBlankDecryptService \ No newline at end of file -- Gitee From 1eb8afbe71296e6d6aa7be55a2425d50c2e39a9d Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 10:51:20 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=97=A0?= =?UTF-8?q?=E9=9C=80=E8=A7=A3=E5=AF=86=E7=9A=84=E5=AE=9E=E7=8E=B0=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java b/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java index 937a820..3869380 100644 --- a/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java +++ b/core/captcha-plus/src/test/java/com/xingyuv/captcha/util/CaptchaDecryptServiceTest.java @@ -11,6 +11,8 @@ public class CaptchaDecryptServiceTest { void testGetInstance() { CaptchaDecryptService aes = CaptchaDecryptServiceFactory.getDecryptService("AES"); assertNotNull(aes); + CaptchaDecryptService blank = CaptchaDecryptServiceFactory.getDecryptService("blank"); + assertNotNull(blank); CaptchaDecryptService test = CaptchaDecryptServiceFactory.getDecryptService("test"); assertNotNull(test); } -- Gitee From 7ab64d1520fc90ada72190743d2fdf42a60dd392 Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 11:32:57 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=20spring=20boot?= =?UTF-8?q?=20=E5=90=AF=E5=8A=A8=E6=97=B6=E4=BC=9A=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E7=9A=84=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xingyuv/captcha/properties/AjCaptchaProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java index 3de6714..123e82b 100644 --- a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java +++ b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java @@ -113,7 +113,7 @@ public class AjCaptchaProperties { */ private int clickWordCount = 4; - private String decryptType; + private String decryptType = "aes"; public int getFontStyle() { return fontStyle; -- Gitee From f32231a5d5710808acc45a1b2ad288b835954928 Mon Sep 17 00:00:00 2001 From: xieyu Date: Thu, 13 Jun 2024 14:07:15 +0800 Subject: [PATCH 10/10] =?UTF-8?q?fix:=20=E5=B0=86=20aesStatus=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E8=AE=BE=E7=BD=AE=E4=B8=BA=E5=B7=B2=E5=BC=83=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E6=A0=B9=E6=8D=AE=E6=89=80=E9=87=87=E7=94=A8=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=AE=97=E6=B3=95=E8=87=AA=E5=8A=A8=E5=90=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xingyuv/captcha/properties/AjCaptchaProperties.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java index 123e82b..d4d95d8 100644 --- a/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java +++ b/core/spring-boot-starter-captcha-plus/src/main/java/com/xingyuv/captcha/properties/AjCaptchaProperties.java @@ -51,6 +51,7 @@ public class AjCaptchaProperties { /** * aes加密坐标开启或者禁用(true|false). */ + @Deprecated private Boolean aesStatus = true; /** @@ -274,10 +275,12 @@ public class AjCaptchaProperties { this.slipOffset = slipOffset; } + @Deprecated public Boolean getAesStatus() { return aesStatus; } + @Deprecated public void setAesStatus(Boolean aesStatus) { this.aesStatus = aesStatus; } -- Gitee