From 40e0460e15434f3aaebd88b25ae7b12f4620d80d Mon Sep 17 00:00:00 2001 From: wind Date: Thu, 28 Mar 2024 15:40:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E6=89=8B=E6=9C=BA=E5=8F=B7=E6=98=AF=E5=90=A6=E5=90=88?= =?UTF-8?q?=E6=B3=95=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87=E5=AE=9E=E7=8E=B0=E6=AD=A4?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=BF=9B=E8=A1=8C=E6=89=8B=E6=9C=BA=E5=8F=B7?= =?UTF-8?q?=E5=90=88=E6=B3=95=E6=80=A7=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/api/verify/PhoneVerify.java | 23 +++++++++++++++ .../dromara/sms4j/comm/constant/Constant.java | 2 +- .../sms4j/core/proxy/SmsProxyFactory.java | 2 +- .../CoreMethodParamValidateProcessor.java | 21 +++++++++++++- .../sms4j/lianlu/config/LianLuFactory.java | 3 ++ .../sms4j/zhutong/config/ZhutongFactory.java | 3 ++ .../starter/config/SmsBlendsInitializer.java | 29 +++++++++++++------ 7 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 sms4j-api/src/main/java/org/dromara/sms4j/api/verify/PhoneVerify.java diff --git a/sms4j-api/src/main/java/org/dromara/sms4j/api/verify/PhoneVerify.java b/sms4j-api/src/main/java/org/dromara/sms4j/api/verify/PhoneVerify.java new file mode 100644 index 00000000..d5b6cb78 --- /dev/null +++ b/sms4j-api/src/main/java/org/dromara/sms4j/api/verify/PhoneVerify.java @@ -0,0 +1,23 @@ +package org.dromara.sms4j.api.verify; + +/** + * PhoneVerify + *

实现校验手机号合规的接口 + * @author :Wind + * 2024/3/28 14:15 + **/ +public interface PhoneVerify{ + + /** + * verifyPhone + *

用于校验手机号是否合理的规则方法,可以尝试重写此方法以改变规则,例如你可以选择使用正则表达式来进行 + * 一系列更加精准和严格的校验,此校验优先级最高,会在黑名单和其他拦截之前执行。 + * 当此校验触发时候,将会直接以异常形式进行抛出,并终止后续向厂商请求的动作,故而不会有返回值。 + * 当校验手机号合格时返回 true 否则返回 false + * @param phone 被校验的手机号 + * @author :Wind + */ + default boolean verifyPhone(String phone){ + return phone.length() == 11; + } +} diff --git a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java index 00dbea90..edcd0edb 100644 --- a/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java +++ b/sms4j-comm/src/main/java/org/dromara/sms4j/comm/constant/Constant.java @@ -11,7 +11,7 @@ public abstract class Constant { /** * 项目版本号 */ - public static final String VERSION = "V 3.0.1"; + public static final String VERSION = "V 3.2.0"; /** * 用于格式化鉴权头域,给"Authorization"参数赋值 diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsProxyFactory.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsProxyFactory.java index 064d44b7..25be0138 100644 --- a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsProxyFactory.java +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsProxyFactory.java @@ -101,7 +101,7 @@ public abstract class SmsProxyFactory { Class clazz = Class.forName(className); Method getSmsDao = clazz.getMethod("getSmsDao", null); SmsDao smsDao = (SmsDao) getSmsDao.invoke(null, null); - log.info("{}:加载SmsDao成功,使用{}", frameworkName,smsDao.getClass().getName()); + log.debug("{}:加载SmsDao成功,使用{}", frameworkName,smsDao.getClass().getName()); return smsDao; } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { log.debug("{}:尝试其他框架加载......", frameworkName); diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/CoreMethodParamValidateProcessor.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/CoreMethodParamValidateProcessor.java index 64ec8447..480bf09e 100644 --- a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/CoreMethodParamValidateProcessor.java +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/processor/CoreMethodParamValidateProcessor.java @@ -1,8 +1,10 @@ package org.dromara.sms4j.core.proxy.processor; import cn.hutool.core.util.StrUtil; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.proxy.CoreMethodProcessor; +import org.dromara.sms4j.api.verify.PhoneVerify; import org.dromara.sms4j.comm.exception.SmsBlendException; import java.util.LinkedHashMap; @@ -16,8 +18,20 @@ import java.util.Objects; * @author sh1yu * @since 2023/10/27 13:03 */ +@Setter @Slf4j public class CoreMethodParamValidateProcessor implements CoreMethodProcessor { + + /** + * -- SETTER -- + * 设置 phoneVerify + */ + private PhoneVerify phoneVerify; + + public CoreMethodParamValidateProcessor(PhoneVerify phoneVerify) { + this.phoneVerify = phoneVerify; + } + @Override public int getOrder() { return -1; @@ -63,6 +77,9 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor { if (StrUtil.isBlank(phone)) { throw new SmsBlendException("cant send message to null!"); } + if (phoneVerify != null && !phoneVerify.verifyPhone(phone)){ + throw new SmsBlendException("The mobile phone number format is invalid!"); + } } public void validatePhones(List phones) { @@ -71,7 +88,9 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor { } for (String phone : phones) { if (StrUtil.isNotBlank(phone)) { - return; + if (phoneVerify != null && !phoneVerify.verifyPhone(phone)){ + throw new SmsBlendException("The mobile phone number format is invalid!"); + } } } throw new SmsBlendException("cant send message to null!"); diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/lianlu/config/LianLuFactory.java b/sms4j-provider/src/main/java/org/dromara/sms4j/lianlu/config/LianLuFactory.java index 6477fbde..d03a9ac4 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/lianlu/config/LianLuFactory.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/lianlu/config/LianLuFactory.java @@ -4,6 +4,9 @@ import org.dromara.sms4j.comm.constant.SupplierConstant; import org.dromara.sms4j.lianlu.service.LianLuSmsImpl; import org.dromara.sms4j.provider.factory.BaseProviderFactory; +/** + * 联鹿短信 + * */ public class LianLuFactory implements BaseProviderFactory { private static final LianLuFactory INSTANCE = new LianLuFactory(); diff --git a/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/config/ZhutongFactory.java b/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/config/ZhutongFactory.java index 154c63c1..ec63be42 100644 --- a/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/config/ZhutongFactory.java +++ b/sms4j-provider/src/main/java/org/dromara/sms4j/zhutong/config/ZhutongFactory.java @@ -6,6 +6,9 @@ import org.dromara.sms4j.comm.constant.SupplierConstant; import org.dromara.sms4j.provider.factory.AbstractProviderFactory; import org.dromara.sms4j.zhutong.service.ZhutongSmsImpl; +/** + * 助通短信 + * */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ZhutongFactory extends AbstractProviderFactory { private static final ZhutongFactory INSTANCE = new ZhutongFactory(); diff --git a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java index f784546a..accbb2d9 100644 --- a/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java +++ b/sms4j-spring-boot-starter/src/main/java/org/dromara/sms4j/starter/config/SmsBlendsInitializer.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.aliyun.config.AlibabaFactory; import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.universal.SupplierConfig; +import org.dromara.sms4j.api.verify.PhoneVerify; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.enumerate.ConfigType; @@ -41,10 +42,11 @@ import org.springframework.beans.factory.ObjectProvider; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; @Slf4j -public class SmsBlendsInitializer { +public class SmsBlendsInitializer { private final List> factoryList; private final SmsConfig smsConfig; @@ -54,7 +56,7 @@ public class SmsBlendsInitializer { public SmsBlendsInitializer(List> factoryList, SmsConfig smsConfig, Map> blends, - ObjectProvider extendsSmsConfigs){ + ObjectProvider extendsSmsConfigs) { this.factoryList = factoryList; this.smsConfig = smsConfig; this.blends = blends; @@ -67,7 +69,7 @@ public class SmsBlendsInitializer { // 注册短信对象工厂 ProviderFactoryHolder.registerFactory(factoryList); - if(ConfigType.YAML.equals(this.smsConfig.getConfigType())) { + if (ConfigType.YAML.equals(this.smsConfig.getConfigType())) { //持有初始化配置信息 Map> blendsInclude = new ConfigCombineMapAdeptor>(); blendsInclude.putAll(this.blends); @@ -75,8 +77,8 @@ public class SmsBlendsInitializer { for (SmsReadConfig smsReadConfig : extendsSmsConfigs) { String key = SmsReadConfig.class.getSimpleName() + num; Map insideMap = new HashMap<>(); - insideMap.put(key,smsReadConfig); - blendsInclude.put(key,insideMap); + insideMap.put(key, smsReadConfig); + blendsInclude.put(key, insideMap); num++; } EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude); @@ -85,15 +87,24 @@ public class SmsBlendsInitializer { SmsProxyFactory.addProcessor(new BlackListProcessor()); SmsProxyFactory.addProcessor(new BlackListRecordingProcessor()); SmsProxyFactory.addProcessor(new SingleBlendRestrictedProcessor()); - SmsProxyFactory.addProcessor(new CoreMethodParamValidateProcessor()); + //如果手机号校验器存在实现,则注册手机号校验器 + ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); + if (loader.iterator().hasNext()) { + loader.forEach(f->{ + SmsProxyFactory.addProcessor(new CoreMethodParamValidateProcessor(f)); + }); + }else { + SmsProxyFactory.addProcessor(new CoreMethodParamValidateProcessor(null)); + } + // 解析供应商配置 - for(String configId : blends.keySet()) { + for (String configId : blends.keySet()) { Map configMap = blends.get(configId); Object supplierObj = configMap.get(Constant.SUPPLIER_KEY); String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); supplier = StrUtil.isEmpty(supplier) ? configId : supplier; BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); - if(providerFactory == null) { + if (providerFactory == null) { log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier); continue; } @@ -125,7 +136,7 @@ public class SmsBlendsInitializer { ProviderFactoryHolder.registerFactory(LianLuFactory.instance()); ProviderFactoryHolder.registerFactory(DingZhongFactory.instance()); ProviderFactoryHolder.registerFactory(QiNiuFactory.instance()); - if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { + if (SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) { ProviderFactoryHolder.registerFactory(JdCloudFactory.instance()); } log.debug("加载内置运营商完成!");