防重幂等
功能说明
对标注了 @MssSafety 且 isRepetition() 为 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(毫秒),以当前环境配置为准


