REQ-2411: 不限制短信验证码的重复内容发送
This commit is contained in:
parent
839dd66672
commit
2de9db2e3e
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user