原创

Java-检查短信发送频率-检查发送次数限制

redisCacheUtils 是执行封装的
/**
* 检查发送频率
*
* @param tel 手机号
*/
private void checkFrequency(String tel) {
String redisKey = String.format(RedisKeyConstants.VERIFICATION_TIME, tel);
int smsFrequencyMinutes = nacosConfig.getSmsFrequencyMinutes();
long currentTime = System.currentTimeMillis();
String lastSentTimeStr = redisCacheUtils.getByKey(redisKey);
if (StringUtils.isNotBlank(lastSentTimeStr)) {
long lastSentTime = Long.parseLong(lastSentTimeStr);
long timeElapsedMinutes = (currentTime - lastSentTime) / (1000 * 60);
if (timeElapsedMinutes < smsFrequencyMinutes) {
// 发送过于频繁,进行相应处理
throw new BizzException(String.format("%s分钟之内,同一个手机号只能发一次短信,不能发太频繁", smsFrequencyMinutes));
}
}
// 更新最后发送时间
redisCacheUtils.set(redisKey, String.valueOf(currentTime), smsFrequencyMinutes, TimeUnit.MINUTES);
}

/**
* 检查发送次数限制
*
* @param tel 手机号
*/
private void checkDailyLimit(String tel) {
String redisKey = String.format(RedisKeyConstants.VERIFICATION_LIMIT, tel);
Long sentCount = redisCacheUtils.incr(redisKey);
int maxDailySmsLimit = nacosConfig.getMaxDailySmsLimit();
if (sentCount > maxDailySmsLimit) {
// 达到每日发送上限,进行相应处理
throw new BizzException(String.format("每天最多只能发送%s条短信,现在已达上限", maxDailySmsLimit));
}
// 设置每日发送次数的过期时间为当天的最后一秒钟,用于自动重置次数
redisCacheUtils.expireAtEndOfDay(redisKey);
}
正文到此结束
本文目录