mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 17:08:40 +08:00
添加一个校验手机号是否合法的接口,用户可以通过实现此接口进行手机号合法性校验
This commit is contained in:
parent
8f60ed63a9
commit
40e0460e15
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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"参数赋值
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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!");
|
||||||
|
|||||||
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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,6 +42,7 @@ 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
|
||||||
@ -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("加载内置运营商完成!");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user