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("加载内置运营商完成!");