mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 08:58:38 +08:00
Merge branch 'refs/heads/dev-3.0.x'
This commit is contained in:
commit
bd44f0d097
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@ public interface PhoneVerify{
|
||||
* <p>用于校验手机号是否合理的规则方法,可以尝试重写此方法以改变规则,例如你可以选择使用正则表达式来进行
|
||||
* 一系列更加精准和严格的校验,此校验优先级最高,会在黑名单和其他拦截之前执行。
|
||||
* 当此校验触发时候,将会直接以异常形式进行抛出,并终止后续向厂商请求的动作,故而不会有返回值。
|
||||
* 当校验手机号合格时返回 true 否则返回 false
|
||||
* <p>当校验手机号合格时应返回 true 否则返回 false
|
||||
* @param phone 被校验的手机号
|
||||
* @author :Wind
|
||||
*/
|
||||
|
||||
@ -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,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;
|
||||
|
||||
@ -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
|
||||
*/
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user