Skip to content

防重幂等

功能说明

对标注了 @MssSafetyisRepetition()true(默认值)的接口,在解析 JSON 请求体 时通过 Redis 防止短时间内重复提交。

注意

防重用于避免同一调用方连点、网络重试导致的重复写;高并发压测与「业务幂等」不是同一话题,需结合业务唯一键、数据库约束等设计。

实现要点(与 mms-framework 一致)

项目说明
生效条件RequestBodyHandlerAdvice.supports(...)decryptRequest || isRepetition 为 true 时对 @RequestBody 走 Advice
Redis 键前缀常量 X-Nonce + <参数名>:<方法名>(代码:NONCE_KEY + parameter.getParameterName() + ":" + parameter.getExecutable().getName()
键存活时间encryption.repeated-time(毫秒),如主工程 application.yml 中示例 500
重复时抛出 MmsException,提示 请求过快,请稍后再试!

因此:防重维度是 「该接口 @RequestBody 形参名 + 控制器方法名」,而非文档历史写法中的「URL 路径」;同一方法、同一形参名在间隔时间内重复提交会被拦截。

关闭防重

在方法或类上的 @MssSafety 中设置:

java
@MssSafety(isRepetition = false, decryptRequest = true)

若仅需验签解密而不防重,请显式关闭 isRepetition,并注意此时 supports 仍可能因 decryptRequest == true 而启用 Advice。

配置示例

yaml
encryption:
  enable: true
  valid-time: 3000
  repeated-time: 500   # 防重键 TTL(毫秒),以当前环境配置为准

Released under the MIT License.