添加一个校验手机号是否合法的接口,用户可以通过实现此接口进行手机号合法性校验

This commit is contained in:
wind 2024-03-28 15:40:44 +08:00
parent 8f60ed63a9
commit 40e0460e15
7 changed files with 71 additions and 12 deletions

View File

@ -0,0 +1,23 @@
package org.dromara.sms4j.api.verify;
/**
* PhoneVerify
* <p> 实现校验手机号合规的接口
* @author :Wind
* 2024/3/28 14:15
**/
public interface PhoneVerify{
/**
* verifyPhone
* <p>用于校验手机号是否合理的规则方法可以尝试重写此方法以改变规则例如你可以选择使用正则表达式来进行
* 一系列更加精准和严格的校验此校验优先级最高会在黑名单和其他拦截之前执行
* 当此校验触发时候将会直接以异常形式进行抛出并终止后续向厂商请求的动作故而不会有返回值
* 当校验手机号合格时返回 true 否则返回 false
* @param phone 被校验的手机号
* @author :Wind
*/
default boolean verifyPhone(String phone){
return phone.length() == 11;
}
}

View File

@ -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"参数赋值 * 用于格式化鉴权头域,"Authorization"参数赋值

View File

@ -101,7 +101,7 @@ public abstract class SmsProxyFactory {
Class<?> clazz = Class.forName(className); Class<?> clazz = Class.forName(className);
Method getSmsDao = clazz.getMethod("getSmsDao", null); Method getSmsDao = clazz.getMethod("getSmsDao", null);
SmsDao smsDao = (SmsDao) getSmsDao.invoke(null, null); SmsDao smsDao = (SmsDao) getSmsDao.invoke(null, null);
log.info("{}:加载SmsDao成功使用{}", frameworkName,smsDao.getClass().getName()); log.debug("{}:加载SmsDao成功使用{}", frameworkName,smsDao.getClass().getName());
return smsDao; return smsDao;
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
log.debug("{}:尝试其他框架加载......", frameworkName); log.debug("{}:尝试其他框架加载......", frameworkName);

View File

@ -1,8 +1,10 @@
package org.dromara.sms4j.core.proxy.processor; package org.dromara.sms4j.core.proxy.processor;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.proxy.CoreMethodProcessor; import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
import org.dromara.sms4j.api.verify.PhoneVerify;
import org.dromara.sms4j.comm.exception.SmsBlendException; import org.dromara.sms4j.comm.exception.SmsBlendException;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -16,8 +18,20 @@ import java.util.Objects;
* @author sh1yu * @author sh1yu
* @since 2023/10/27 13:03 * @since 2023/10/27 13:03
*/ */
@Setter
@Slf4j @Slf4j
public class CoreMethodParamValidateProcessor implements CoreMethodProcessor { public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
/**
* -- SETTER --
* 设置 phoneVerify
*/
private PhoneVerify phoneVerify;
public CoreMethodParamValidateProcessor(PhoneVerify phoneVerify) {
this.phoneVerify = phoneVerify;
}
@Override @Override
public int getOrder() { public int getOrder() {
return -1; return -1;
@ -63,6 +77,9 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
if (StrUtil.isBlank(phone)) { if (StrUtil.isBlank(phone)) {
throw new SmsBlendException("cant send message to null!"); 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<String> phones) { public void validatePhones(List<String> phones) {
@ -71,7 +88,9 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
} }
for (String phone : phones) { for (String phone : phones) {
if (StrUtil.isNotBlank(phone)) { 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!"); throw new SmsBlendException("cant send message to null!");

View File

@ -4,6 +4,9 @@ import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.lianlu.service.LianLuSmsImpl; import org.dromara.sms4j.lianlu.service.LianLuSmsImpl;
import org.dromara.sms4j.provider.factory.BaseProviderFactory; import org.dromara.sms4j.provider.factory.BaseProviderFactory;
/**
* 联鹿短信
* */
public class LianLuFactory implements BaseProviderFactory<LianLuSmsImpl, LianLuConfig> { public class LianLuFactory implements BaseProviderFactory<LianLuSmsImpl, LianLuConfig> {
private static final LianLuFactory INSTANCE = new LianLuFactory(); private static final LianLuFactory INSTANCE = new LianLuFactory();

View File

@ -6,6 +6,9 @@ import org.dromara.sms4j.comm.constant.SupplierConstant;
import org.dromara.sms4j.provider.factory.AbstractProviderFactory; import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
import org.dromara.sms4j.zhutong.service.ZhutongSmsImpl; import org.dromara.sms4j.zhutong.service.ZhutongSmsImpl;
/**
* 助通短信
* */
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ZhutongFactory extends AbstractProviderFactory<ZhutongSmsImpl, ZhutongConfig> { public class ZhutongFactory extends AbstractProviderFactory<ZhutongSmsImpl, ZhutongConfig> {
private static final ZhutongFactory INSTANCE = new ZhutongFactory(); private static final ZhutongFactory INSTANCE = new ZhutongFactory();

View File

@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.aliyun.config.AlibabaFactory; import org.dromara.sms4j.aliyun.config.AlibabaFactory;
import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.universal.SupplierConfig; 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.cloopen.config.CloopenFactory;
import org.dromara.sms4j.comm.constant.Constant; import org.dromara.sms4j.comm.constant.Constant;
import org.dromara.sms4j.comm.enumerate.ConfigType; import org.dromara.sms4j.comm.enumerate.ConfigType;
@ -41,10 +42,11 @@ import org.springframework.beans.factory.ObjectProvider;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.ServiceLoader;
@Slf4j @Slf4j
public class SmsBlendsInitializer { public class SmsBlendsInitializer {
private final List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList; private final List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
private final SmsConfig smsConfig; private final SmsConfig smsConfig;
@ -54,7 +56,7 @@ public class SmsBlendsInitializer {
public SmsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList, public SmsBlendsInitializer(List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList,
SmsConfig smsConfig, SmsConfig smsConfig,
Map<String, Map<String, Object>> blends, Map<String, Map<String, Object>> blends,
ObjectProvider<SmsReadConfig> extendsSmsConfigs){ ObjectProvider<SmsReadConfig> extendsSmsConfigs) {
this.factoryList = factoryList; this.factoryList = factoryList;
this.smsConfig = smsConfig; this.smsConfig = smsConfig;
this.blends = blends; this.blends = blends;
@ -67,7 +69,7 @@ public class SmsBlendsInitializer {
// 注册短信对象工厂 // 注册短信对象工厂
ProviderFactoryHolder.registerFactory(factoryList); ProviderFactoryHolder.registerFactory(factoryList);
if(ConfigType.YAML.equals(this.smsConfig.getConfigType())) { if (ConfigType.YAML.equals(this.smsConfig.getConfigType())) {
//持有初始化配置信息 //持有初始化配置信息
Map<String, Map<String, Object>> blendsInclude = new ConfigCombineMapAdeptor<String, Map<String, Object>>(); Map<String, Map<String, Object>> blendsInclude = new ConfigCombineMapAdeptor<String, Map<String, Object>>();
blendsInclude.putAll(this.blends); blendsInclude.putAll(this.blends);
@ -75,8 +77,8 @@ public class SmsBlendsInitializer {
for (SmsReadConfig smsReadConfig : extendsSmsConfigs) { for (SmsReadConfig smsReadConfig : extendsSmsConfigs) {
String key = SmsReadConfig.class.getSimpleName() + num; String key = SmsReadConfig.class.getSimpleName() + num;
Map<String, Object> insideMap = new HashMap<>(); Map<String, Object> insideMap = new HashMap<>();
insideMap.put(key,smsReadConfig); insideMap.put(key, smsReadConfig);
blendsInclude.put(key,insideMap); blendsInclude.put(key, insideMap);
num++; num++;
} }
EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude); EnvirmentHolder.frozenEnvirmet(smsConfig, blendsInclude);
@ -85,15 +87,24 @@ public class SmsBlendsInitializer {
SmsProxyFactory.addProcessor(new BlackListProcessor()); SmsProxyFactory.addProcessor(new BlackListProcessor());
SmsProxyFactory.addProcessor(new BlackListRecordingProcessor()); SmsProxyFactory.addProcessor(new BlackListRecordingProcessor());
SmsProxyFactory.addProcessor(new SingleBlendRestrictedProcessor()); SmsProxyFactory.addProcessor(new SingleBlendRestrictedProcessor());
SmsProxyFactory.addProcessor(new CoreMethodParamValidateProcessor()); //如果手机号校验器存在实现则注册手机号校验器
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()) { for (String configId : blends.keySet()) {
Map<String, Object> configMap = blends.get(configId); Map<String, Object> configMap = blends.get(configId);
Object supplierObj = configMap.get(Constant.SUPPLIER_KEY); Object supplierObj = configMap.get(Constant.SUPPLIER_KEY);
String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); String supplier = supplierObj == null ? "" : String.valueOf(supplierObj);
supplier = StrUtil.isEmpty(supplier) ? configId : supplier; supplier = StrUtil.isEmpty(supplier) ? configId : supplier;
BaseProviderFactory<SmsBlend, SupplierConfig> providerFactory = (BaseProviderFactory<SmsBlend, org.dromara.sms4j.api.universal.SupplierConfig>) ProviderFactoryHolder.requireForSupplier(supplier); BaseProviderFactory<SmsBlend, SupplierConfig> providerFactory = (BaseProviderFactory<SmsBlend, org.dromara.sms4j.api.universal.SupplierConfig>) ProviderFactoryHolder.requireForSupplier(supplier);
if(providerFactory == null) { if (providerFactory == null) {
log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier); log.warn("创建\"{}\"的短信服务失败,未找到供应商为\"{}\"的服务", configId, supplier);
continue; continue;
} }
@ -125,7 +136,7 @@ public class SmsBlendsInitializer {
ProviderFactoryHolder.registerFactory(LianLuFactory.instance()); ProviderFactoryHolder.registerFactory(LianLuFactory.instance());
ProviderFactoryHolder.registerFactory(DingZhongFactory.instance()); ProviderFactoryHolder.registerFactory(DingZhongFactory.instance());
ProviderFactoryHolder.registerFactory(QiNiuFactory.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()); ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
} }
log.debug("加载内置运营商完成!"); log.debug("加载内置运营商完成!");