From 5020771a7a5220181c98226334a8f74133fc4d65 Mon Sep 17 00:00:00 2001 From: wind Date: Mon, 29 Jul 2024 10:58:32 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=99=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=8C=E7=94=A8=E6=88=B7=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B7=BB=E5=8A=A0=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8=E5=B9=B6=E4=B8=94=E5=AE=9E=E7=8E=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/sms4j/api/proxy/SmsProcessor.java | 32 +++++++++++++++-- .../core/proxy/SmsInvocationHandler.java | 28 +++++++-------- .../sms4j/core/proxy/SmsProxyFactory.java | 26 +++++++++++--- .../starter/config/SmsBlendsInitializer.java | 36 +++++++++---------- 4 files changed, 82 insertions(+), 40 deletions(-) diff --git a/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/SmsProcessor.java b/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/SmsProcessor.java index e4c26572..9e865770 100644 --- a/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/SmsProcessor.java +++ b/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/SmsProcessor.java @@ -1,6 +1,8 @@ package org.dromara.sms4j.api.proxy; +import org.dromara.sms4j.api.entity.SmsResponse; + import java.lang.reflect.Method; /** * 执行器接口 @@ -9,15 +11,39 @@ import java.lang.reflect.Method; * @since 2023/10/27 13:03 */ public interface SmsProcessor extends Order { + /** + * preProcessor + *

前置拦截方法 此方法将在短信发送方法之前进行执行,但请勿在此方法中修改实例对象或者方法对象,否则可能会导致并发问题 + * @param method 方法对象 + * @param source 实例对象 + * @param param 参数列表 + * @author :Wind + */ default Object[] preProcessor(Method method, Object source, Object[] param) { return null; } - default Object postProcessor(Object result, Object[] param) { + /** + * postProcessor + *

后置拦截方法 此方法执行在发送方法执行完毕之后获取到返回值之后 + * @param result 返回值 + * @param param 参数列表 + * @author :Wind + */ + default Object postProcessor(SmsResponse result, Object[] param) { return null; } - default Object exceptionHandleProcessor(Method method, Object source, Object[] param,Exception exception) { - return null; + /** + * exceptionHandleProcessor + *

异常拦截执行器,在发送方法执行过程中发生异常,将会通过此方法进行反馈。 + *

请注意,此方法一旦捕捉到相应异常并抛出新异常后,会中断后续执行器的进行 如果在所有的异常执行器中均没有抛出异常,则后续会进入后置方法执行器 + * @param method 方法对象 + * @param source 实例对象 + * @param param 参数列表 + * @param exception 异常 + * @author :Wind + */ + default void exceptionHandleProcessor(Method method, Object source, Object[] param, Exception exception) throws RuntimeException { } } diff --git a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsInvocationHandler.java b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsInvocationHandler.java index 7465e12f..942a8baf 100644 --- a/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsInvocationHandler.java +++ b/sms4j-core/src/main/java/org/dromara/sms4j/core/proxy/SmsInvocationHandler.java @@ -2,12 +2,12 @@ package org.dromara.sms4j.core.proxy; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.SmsBlend; +import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.api.proxy.SmsProcessor; -import org.dromara.sms4j.comm.exception.SmsBlendException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; -import java.util.LinkedList; +import java.util.Objects; /** @@ -19,12 +19,10 @@ import java.util.LinkedList; @Slf4j public class SmsInvocationHandler implements InvocationHandler { private final SmsBlend smsBlend; - private final LinkedList processors; - public SmsInvocationHandler(SmsBlend smsBlend, LinkedList processors) { + public SmsInvocationHandler(SmsBlend smsBlend) { this.smsBlend = smsBlend; - this.processors = processors; } @Override @@ -37,18 +35,16 @@ public class SmsInvocationHandler implements InvocationHandler { } catch (Exception e) { //错误执行器 doErrorHandleProcess(smsBlend, method, objects,e); - throw new SmsBlendException(e); } //后置执行器 - doPostrocess(smsBlend, method, objects, result); - return result; + return doPostrocess(smsBlend, method, objects, result); } /** * 前置执行器 * */ public Object[] doPreProcess(Object o, Method method, Object[] objects) { - for (SmsProcessor processor : processors) { + for (SmsProcessor processor : SmsProxyFactory.getProcessors()) { objects = processor.preProcessor(method, o, objects); } return objects; @@ -57,8 +53,8 @@ public class SmsInvocationHandler implements InvocationHandler { /** * 异常执行器 * */ - public void doErrorHandleProcess(Object o, Method method, Object[] objects,Exception e) { - for (SmsProcessor processor : processors) { + public void doErrorHandleProcess(Object o, Method method, Object[] objects,Exception e) throws RuntimeException{ + for (SmsProcessor processor : SmsProxyFactory.getProcessors()) { processor.exceptionHandleProcessor(method, o, objects,e); } } @@ -67,10 +63,12 @@ public class SmsInvocationHandler implements InvocationHandler { * 后置执行器 * */ public Object doPostrocess(Object o, Method method, Object[] objects, Object result) { - for (SmsProcessor processor : processors) { - Object overrideResult = processor.postProcessor(result, objects); - if (overrideResult != null) { - return overrideResult; + for (SmsProcessor processor : SmsProxyFactory.getProcessors()) { + if (Objects.nonNull(result) && result instanceof SmsResponse){ + Object overrideResult = processor.postProcessor((SmsResponse)result, objects); + if (overrideResult != null) { + return overrideResult; + } } } return result; 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 6f32c58a..99c0b92c 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 @@ -17,7 +17,6 @@ import java.lang.reflect.Proxy; import java.util.Comparator; import java.util.LinkedList; import java.util.List; -import java.util.stream.Collectors; /** * SmsBlend代理工厂 @@ -30,14 +29,14 @@ public abstract class SmsProxyFactory { private static final LinkedList PROCESSORS = new LinkedList<>(); public static SmsBlend getProxySmsBlend(SmsBlend smsBlend) { - LinkedList ownerProcessors = PROCESSORS.stream().filter(processor -> !shouldSkipProcess(processor,smsBlend)).collect(Collectors.toCollection(LinkedList::new)); - return (SmsBlend) Proxy.newProxyInstance(smsBlend.getClass().getClassLoader(), new Class[]{SmsBlend.class}, new SmsInvocationHandler(smsBlend, ownerProcessors)); +// LinkedList ownerProcessors = PROCESSORS.stream().filter(processor -> !shouldSkipProcess(processor,smsBlend)).collect(Collectors.toCollection(LinkedList::new)); + return (SmsBlend) Proxy.newProxyInstance(smsBlend.getClass().getClassLoader(), new Class[]{SmsBlend.class}, new SmsInvocationHandler(smsBlend)); } /** * 增加拦截器 */ - public static void addProcessor(SmsProcessor processor) { + public static void addPreProcessor(SmsProcessor processor) { //校验拦截器是否正确 processorValidate(processor); awareTransfer(processor); @@ -45,6 +44,25 @@ public abstract class SmsProxyFactory { PROCESSORS.sort(Comparator.comparingInt(Order::getOrder)); } + /** + * removeProcessor + *

移除拦截器 + * @param processor 拦截器对象 + * @author :Wind + */ + public static void removePreProcessor(SmsProcessor processor) { + PROCESSORS.remove(processor); + } + + /** + * getProcessors + *

获取全部拦截器 + * @author :Wind + */ + public static LinkedList getProcessors() { + return PROCESSORS; + } + /* * @see SuppotFilter */ 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 27e4b6dc..6a453de8 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,9 +7,10 @@ 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.baidu.config.BaiduFactory; import org.dromara.sms4j.budingyun.config.BudingV2Factory; -import org.dromara.sms4j.api.verify.PhoneVerify; +import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.cloopen.config.CloopenFactory; import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.enums.ConfigType; @@ -29,7 +30,6 @@ import org.dromara.sms4j.dingzhong.config.DingZhongFactory; import org.dromara.sms4j.emay.config.EmayFactory; import org.dromara.sms4j.huawei.config.HuaweiFactory; import org.dromara.sms4j.jdcloud.config.JdCloudFactory; -import org.dromara.sms4j.chuanglan.config.ChuangLanFactory; import org.dromara.sms4j.jg.config.JgFactory; import org.dromara.sms4j.lianlu.config.LianLuFactory; import org.dromara.sms4j.luosimao.config.LuoSiMaoFactory; @@ -76,7 +76,22 @@ public class SmsBlendsInitializer { this.registerDefaultFactory(); // 注册短信对象工厂 ProviderFactoryHolder.registerFactory(factoryList); - + //注册执行器实现 + if(this.smsConfig.getRestricted()){ + SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); + SmsProxyFactory.addPreProcessor(new SingleBlendRestrictedProcessor()); + } + //如果手机号校验器存在实现,则注册手机号校验器 + ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); + if (loader.iterator().hasNext()) { + loader.forEach(f -> { + SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f)); + }); + } else { + SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); + } if (ConfigType.YAML.equals(this.smsConfig.getConfigType())) { //持有初始化配置信息 Map> blendsInclude = new ConfigCombineMapAdaptor>(); @@ -90,21 +105,6 @@ public class SmsBlendsInitializer { num++; } EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude); - //注册执行器实现 - SmsProxyFactory.addProcessor(new RestrictedProcessor()); - SmsProxyFactory.addProcessor(new BlackListProcessor()); - SmsProxyFactory.addProcessor(new BlackListRecordingProcessor()); - SmsProxyFactory.addProcessor(new SingleBlendRestrictedProcessor()); - //如果手机号校验器存在实现,则注册手机号校验器 - 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()) { Map configMap = blends.get(configId); From 8ec8cf8bd65b27f714286119013239b3afafb289 Mon Sep 17 00:00:00 2001 From: wind Date: Mon, 29 Jul 2024 11:19:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=8B=A6=E6=88=AA=E5=99=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=8C=E7=94=A8=E6=88=B7=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B7=BB=E5=8A=A0=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E5=99=A8=E5=B9=B6=E4=B8=94=E5=AE=9E=E7=8E=B0=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/sms4j/api/proxy/Order.java | 7 ++++--- .../dromara/sms4j/api/verify/PhoneVerify.java | 2 +- .../sms4j/core/proxy/SmsProxyFactory.java | 21 +++++++++++++++++-- .../CoreMethodParamValidateProcessor.java | 13 +++++++++++- .../starter/config/SmsBlendsInitializer.java | 16 +++++++------- 5 files changed, 44 insertions(+), 15 deletions(-) diff --git a/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/Order.java b/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/Order.java index c6b49e91..1ad7d795 100644 --- a/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/Order.java +++ b/sms4j-api/src/main/java/org/dromara/sms4j/api/proxy/Order.java @@ -1,12 +1,13 @@ package org.dromara.sms4j.api.proxy; /** - * 排序接口 - * + * 排序接口 用户拦截器排序并进行有序执行,请注意,排序值应大于等于0。 + * 拦截器的排序依照从小到大的规则进行排序 * @author sh1yu * @since 2023/10/27 13:03 */ public interface Order { - default public int getOrder(){ + + default int getOrder(){ return 999; } } 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 index d5b6cb78..c6c7c233 100644 --- 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 @@ -13,7 +13,7 @@ public interface PhoneVerify{ *

用于校验手机号是否合理的规则方法,可以尝试重写此方法以改变规则,例如你可以选择使用正则表达式来进行 * 一系列更加精准和严格的校验,此校验优先级最高,会在黑名单和其他拦截之前执行。 * 当此校验触发时候,将会直接以异常形式进行抛出,并终止后续向厂商请求的动作,故而不会有返回值。 - * 当校验手机号合格时返回 true 否则返回 false + *

当校验手机号合格时应返回 true 否则返回 false * @param phone 被校验的手机号 * @author :Wind */ 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 99c0b92c..f56afb4b 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 @@ -10,6 +10,8 @@ import org.dromara.sms4j.api.proxy.SuppotFilter; import org.dromara.sms4j.api.proxy.aware.SmsBlendConfigAware; import org.dromara.sms4j.api.proxy.aware.SmsConfigAware; import org.dromara.sms4j.api.proxy.aware.SmsDaoAware; +import org.dromara.sms4j.api.verify.PhoneVerify; +import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -19,8 +21,8 @@ import java.util.LinkedList; import java.util.List; /** - * SmsBlend代理工厂 - * + * 代理工厂 + * 可用于增加和移除拦截器 * @author sh1yu * @since 2023/10/27 13:03 */ @@ -63,6 +65,21 @@ public abstract class SmsProxyFactory { return PROCESSORS; } + /** + * setPhoneProcessor + *

添加手机号验证器,手机号验证器只且只能存在一个,如果重复置入则会替换先前的验证器。 + * 如果在验证器之后还需进行额外操作,请参考使用前置拦截器进行处理 + * @param phoneVerify 手机号验证器 + * @author :Wind + */ + public static void setPhoneProcessor(PhoneVerify phoneVerify) { + PROCESSORS.forEach(processor -> { + if (processor instanceof CoreMethodParamValidateProcessor){ + ((CoreMethodParamValidateProcessor) processor).setPhoneVerify(phoneVerify); + } + }); + } + /* * @see SuppotFilter */ 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 4e05d2e5..dcf579c1 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 @@ -32,9 +32,20 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor { this.phoneVerify = phoneVerify; } + /** + * setter + *

用于设置手机号验证器,可以在通过重写验证器规则来实现自己的验证器逻辑 + *

默认验证规则仅仅验证手机号是否为空和手机号是否为11位 + * @param phoneVerify 手机号验证器 + * @author :Wind + */ + public void setPhoneVerify(PhoneVerify phoneVerify) { + this.phoneVerify = phoneVerify; + } + @Override public int getOrder() { - return -1; + return -100; } @Override 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 6a453de8..6e85edd9 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 @@ -76,14 +76,7 @@ public class SmsBlendsInitializer { this.registerDefaultFactory(); // 注册短信对象工厂 ProviderFactoryHolder.registerFactory(factoryList); - //注册执行器实现 - if(this.smsConfig.getRestricted()){ - SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); - SmsProxyFactory.addPreProcessor(new BlackListProcessor()); - SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); - SmsProxyFactory.addPreProcessor(new SingleBlendRestrictedProcessor()); - } - //如果手机号校验器存在实现,则注册手机号校验器 + //如果手机号校验器存在实现,则注册手机号校验器(暂不可用) ServiceLoader loader = ServiceLoader.load(PhoneVerify.class); if (loader.iterator().hasNext()) { loader.forEach(f -> { @@ -92,6 +85,13 @@ public class SmsBlendsInitializer { } else { SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(null)); } + //注册执行器实现 + if(this.smsConfig.getRestricted()){ + SmsProxyFactory.addPreProcessor(new RestrictedProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListProcessor()); + SmsProxyFactory.addPreProcessor(new BlackListRecordingProcessor()); + SmsProxyFactory.addPreProcessor(new SingleBlendRestrictedProcessor()); + } if (ConfigType.YAML.equals(this.smsConfig.getConfigType())) { //持有初始化配置信息 Map> blendsInclude = new ConfigCombineMapAdaptor>();