发表于: 2020-08-30 23:47:42
1 1373
今天完成的事:
限制同一个手机或者邮箱号的发送频率。
思路:
1.限制发送频率, 需要记录某个手机号(IP)及上次发送短信的时间. 很适合Map去完成, 限制发送频率, 需要记录某个手机号(IP)及上次发送短信的时间. 很适合Map去完成, 这里我们先使用ConcurrentMap实现。
2.首先假设用户是第一次发送短信, 那么应该把现在的时间放到sendAddressMap中. 如果putIfAbsent返回null, 那么说明用户确实是第一次发送短信, 而且现在的时间也已经放到了map中, 可以发送.
3.如果用户不是第一次发送短信, 那么就需要判断上次发送短信的时间和现在的间隔是否小于发送时间间隔. 如果小于发送间隔, 那么不能发送.
4.如果时间间隔足够大, 那么将发送时间设置为当前时间。
/**
* 间隔时间20s
*/
private long intervalTime = 20000L;
/**
* map用来存储手机号或者邮箱号,发送时间
*/
ConcurrentMap<String, Long> sendAddressMap = new ConcurrentHashMap<>();
/**
* 限制发送频率的方法
*
* @param content 手机号或者邮箱
* @return boolean
*/
private boolean limited(String content) {
long currentTime = System.currentTimeMillis();
/*假设用户是第一次发送信息,应该把现在时间,放到map中,如果put返回null
*那么说明用户确实是第一次发送短信,而且现在的时间也放到map中,可以发送。
*/
Long sendTime = sendAddressMap.putIfAbsent(content, currentTime);
if (sendTime == null) {
return true;
} else {
long nextCanSendTime = sendTime + intervalTime;
/**
* 如果当前时间小于可发送的时间间隔
*/
if (currentTime < nextCanSendTime) {
return false;
} else {
return sendAddressMap.replace(content, sendTime, currentTime);
}
}
}
明天的计划:
限定验证码有效时间,限制一个用户可以一天发送验证码的数量。
遇到的问题:
收获:
评论