public class SmsEntity{
private Integer id;
private String mobile;
private String ip;
private Integer type;
private Date time;
private String captcha;
// 省略构造方法和getter、setter方法
}
public interface SmsFilter {
/**
* 初始化该过滤器
*/
void init() throws Exception;
/**
* 判断短信是否可以发送.
* @param smsEntity 将要发送的短信内容
* @return 可以发送则返回true, 否则返回false
*/
boolean filter(SmsEntity smsEntity);
/**
* 销毁该过滤器
*/
void destroy();
}
public class FrequencyFilter implements SmsFilter {
/**
* 发送间隔, 单位: 毫秒
*/
private long sendInterval;
private ConcurrentMap<String, Long> sendAddressMap = new ConcurrentHashMap<>();
// 省略了部分无用代码
@Override
public boolean filter(SmsEntity smsEntity) {
if(setSendTime(smsEntity.getMobile()) && setSendTime(smsEntity.getIp())){
return true;
}
return false;
}
/**
* 将发送时间修改为当前时间.
* 如果距离上次发送的时间间隔大于{@link #sendInterval}则设置发送时间为当前时间. 否则不修改任何内容.
*
* @param id 发送手机号 或 ip
* @return 如果成功将发送时间修改为当前时间, 则返回true. 否则返回false
*/
private boolean setSendTime(String id) {
long currentTime = System.currentTimeMillis();
Long sendTime = sendAddressMap.putIfAbsent(id, currentTime);
if(sendTime == null) {
return true;
}
long nextCanSendTime = sendTime + sendInterval;
if(currentTime < nextCanSendTime) {
return false;
}
return sendAddressMap.replace(id, sendTime, currentTime);
}
}
/**
* 在上面代码的基础上, 再添加如下代码
*/
public class FrequencyFilter implements SmsFilter {
private long cleanMapInterval;
private Timer timer = new Timer("sms_frequency_filter_clear_data_thread");
@Override
public void init() {
timer.schedule(new TimerTask() {
@Override
public void run() {
cleanSendAddressMap();
}
}, cleanMapInterval, cleanMapInterval);
}
/**
* 将sendAddressMap中的所有过期数据删除
*/
private void cleanSendAddressMap() {
long currentTime = System.currentTimeMillis();
long expireSendTime = currentTime - sendInterval;
for(String key : sendAddressMap.keySet()) {
Long sendTime = sendAddressMap.get(key);
if(sendTime < expireSendTime) {
sendAddressMap.remove(key, sendTime);
}
}
}
@Override
public void destroy() {
timer.cancel();
}
}
private boolean setSendTime(String id) {
// 省略前面的代码
if(sendAddressMap.replace(id, sendTime, currentTime)) {
return true;
}
return sendAddressMap.putIfAbsent(id, currentTime) == null;
}
public class SmsService{
private Sms sms;
private List<SmsFilter> filters;
private Properties template;
// 省略了部分代码
/**
* 发送验证码
*
* @param smsEntity 发送短信的基本数据
* @return 如果提交成功, 返回0. 否则返回其他值.
*/
public int sendCaptcha(SmsEntity smsEntity){
for(SmsFilter filter : filters) {
if(!filter.filter(smsEntity)){
return 1;
}
}
if(SmsEntity.REGISTER_TYPE.equals(smsEntity.getType())) {
sendRegisterSms(smsEntity);
}
else{
return 2;
}
return 0;
}
/**
* 发送注册验证码
*
* @param smsEntity 发送短信的基本数据
*/
private void sendRegisterSms(SmsEntity smsEntity) {
sms.sendMessage(smsEntity.getMobile(),
template.getProperty("register").replace("{captcha}", smsEntity.getCaptcha()));
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有