Merge branch 'refs/heads/dev-3.0.x'

This commit is contained in:
wind 2024-07-29 20:57:51 +08:00
commit bd44f0d097
7 changed files with 118 additions and 47 deletions

View File

@ -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;
}
}

View File

@ -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
* <p> 前置拦截方法 此方法将在短信发送方法之前进行执行但请勿在此方法中修改实例对象或者方法对象否则可能会导致并发问题
* @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
* <p> 后置拦截方法 此方法执行在发送方法执行完毕之后获取到返回值之后
* @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
* <p> 异常拦截执行器在发送方法执行过程中发生异常将会通过此方法进行反馈
* <p> 请注意此方法一旦捕捉到相应异常并抛出新异常后会中断后续执行器的进行 如果在所有的异常执行器中均没有抛出异常则后续会进入后置方法执行器
* @param method 方法对象
* @param source 实例对象
* @param param 参数列表
* @param exception 异常
* @author :Wind
*/
default void exceptionHandleProcessor(Method method, Object source, Object[] param, Exception exception) throws RuntimeException {
}
}

View File

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

View File

@ -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<SmsProcessor> processors;
public SmsInvocationHandler(SmsBlend smsBlend, LinkedList<SmsProcessor> 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,12 +63,14 @@ 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);
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;
}
}

View File

@ -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;
@ -17,11 +19,10 @@ import java.lang.reflect.Proxy;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
/**
* SmsBlend代理工厂
*
* 代理工厂
* 可用于增加和移除拦截器
* @author sh1yu
* @since 2023/10/27 13:03
*/
@ -30,14 +31,14 @@ public abstract class SmsProxyFactory {
private static final LinkedList<SmsProcessor> PROCESSORS = new LinkedList<>();
public static SmsBlend getProxySmsBlend(SmsBlend smsBlend) {
LinkedList<SmsProcessor> 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<SmsProcessor> 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 +46,40 @@ public abstract class SmsProxyFactory {
PROCESSORS.sort(Comparator.comparingInt(Order::getOrder));
}
/**
* removeProcessor
* <p> 移除拦截器
* @param processor 拦截器对象
* @author :Wind
*/
public static void removePreProcessor(SmsProcessor processor) {
PROCESSORS.remove(processor);
}
/**
* getProcessors
* <p> 获取全部拦截器
* @author :Wind
*/
public static LinkedList<SmsProcessor> getProcessors() {
return PROCESSORS;
}
/**
* setPhoneProcessor
* <p> 添加手机号验证器手机号验证器只且只能存在一个如果重复置入则会替换先前的验证器
* 如果在验证器之后还需进行额外操作请参考使用前置拦截器进行处理
* @param phoneVerify 手机号验证器
* @author :Wind
*/
public static void setPhoneProcessor(PhoneVerify phoneVerify) {
PROCESSORS.forEach(processor -> {
if (processor instanceof CoreMethodParamValidateProcessor){
((CoreMethodParamValidateProcessor) processor).setPhoneVerify(phoneVerify);
}
});
}
/*
* @see SuppotFilter
*/

View File

@ -32,9 +32,20 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
this.phoneVerify = phoneVerify;
}
/**
* setter
* <p> 用于设置手机号验证器可以在通过重写验证器规则来实现自己的验证器逻辑
* <p> 默认验证规则仅仅验证手机号是否为空和手机号是否为11位
* @param phoneVerify 手机号验证器
* @author :Wind
*/
public void setPhoneVerify(PhoneVerify phoneVerify) {
this.phoneVerify = phoneVerify;
}
@Override
public int getOrder() {
return -1;
return -100;
}
@Override

View File

@ -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);
//如果手机号校验器存在实现则注册手机号校验器暂不可用
ServiceLoader<PhoneVerify> loader = ServiceLoader.load(PhoneVerify.class);
if (loader.iterator().hasNext()) {
loader.forEach(f -> {
SmsProxyFactory.addPreProcessor(new CoreMethodParamValidateProcessor(f));
});
} 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<String, Map<String, Object>> blendsInclude = new ConfigCombineMapAdaptor<String, Map<String, Object>>();
@ -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<PhoneVerify> 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<String, Object> configMap = blends.get(configId);