REQ-2411: 不限制短信验证码的重复内容发送

This commit is contained in:
yanglin 2024-05-07 09:32:14 +08:00
parent 839dd66672
commit 2de9db2e3e

View File

@ -36,7 +36,7 @@ public class MnsLimiter {
* 基于固定窗口, 限制重复内容的发送次数
*/
void maybeLimitSend(MnsRequestDto request) {
if (!props.shouldLimit(request.getTemplateNo())) {
if (!shouldLimit(request)) {
return;
}
// key中包含了固定窗口因子
@ -67,7 +67,7 @@ public class MnsLimiter {
}
void setSendSuccess(MnsRequestDto request) {
if (!props.shouldLimit(request.getTemplateNo())) {
if (!shouldLimit(request)) {
return;
}
// key中包含了固定窗口因子
@ -79,6 +79,14 @@ public class MnsLimiter {
stringRedisTemplate.expire(key, expireMinutes + 1, TimeUnit.MINUTES);
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
private boolean shouldLimit(MnsRequestDto request) {
if (getMnsType(request) == MnsType.VERIFY_CODE) {
return false;
}
return props.shouldLimit(request.getTemplateNo());
}
void setSendFail(MnsRequestDto request, Exception e) {
// NOP
}
@ -87,11 +95,7 @@ public class MnsLimiter {
* 获取key过期时间
*/
private long getTimeAwareExpireTimeMinutes(MnsRequestDto request) {
MnsType msnType = request.getInternalObj(MnsType.class);
if (msnType == null) {
msnType = MnsType.BIZ;
}
return msnType == MnsType.BIZ
return getMnsType(request) == MnsType.BIZ
? TimeUnit.DAYS.toMinutes(1)
: props.getVerifyCodeLimitWindowMinutes();
}
@ -100,10 +104,6 @@ public class MnsLimiter {
* 构建包含时间元素的缓存key, key中包含了固定窗口因子. 固定窗口: 限制发送重复的内容
*/
private String buildTimeAwareKey(MnsRequestDto request) {
MnsType msnType = request.getInternalObj(MnsType.class);
if (msnType == null) {
msnType = MnsType.BIZ;
}
StringBuilder buf = new StringBuilder();
buf.append("msg-center:mns-limit:v1");
Consumer<String> appender = value -> {
@ -111,7 +111,7 @@ public class MnsLimiter {
buf.append(":").append(value);
};
// 通过templateNo和params就可以判断出发送的内容是不是一样的
appender.accept(msnType.getCacheKey());
appender.accept(getMnsType(request).getCacheKey());
appender.accept(request.getTemplateNo());
appender.accept(request.getPhoneNo());
appender.accept(buildTimeAwareSegment(request));
@ -120,14 +120,10 @@ public class MnsLimiter {
}
private String buildTimeAwareSegment(MnsRequestDto request) {
MnsType mnsType = request.getInternalObj(MnsType.class);
if (mnsType == null) {
mnsType = MnsType.BIZ;
}
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
int windowMinutes = props.getVerifyCodeLimitWindowMinutes();
return mnsType == MnsType.BIZ
return getMnsType(request) == MnsType.BIZ
? sdf.format(now)
: String.format("%s-%d-%d",
sdf.format(now), windowMinutes, getVerifySegmentIndex(now, windowMinutes));
@ -169,4 +165,12 @@ public class MnsLimiter {
return hasher.hash().toString();
}
private static MnsType getMnsType(MnsRequestDto request) {
MnsType msnType = request.getInternalObj(MnsType.class);
if (msnType == null) {
msnType = MnsType.BIZ;
}
return msnType;
}
}