参考:
(1)https://www.zhihu.com/question/324268535
我:
(1)方法一:在用户进入下单页面的时候,后台就先生成了一个唯一的订单号,并返回给前台,前台提交订单时带着这个订单号,后台脚本如果同一订单号提交了两次的话,就是重复提交。
(2)方法二:
前后端都是需要验证的。因为前端的验证是可以绕过的。
所以这个问题变成两种情况,一种是恶意提交,就是有人绕过前端验证直接提交,可能来自攻击。另外一种是客户频繁提交,可能是比较焦急的客户。可以把客户的请求按照时间缓存起来,如果太频繁,则返回错误,不处理请求。
示例:
// 登录用户id
Integer userId = RequestHolderUtils.getCurrentUserId();
/**
* 操作是否频繁的判断
*/
String key = String.format("USER_LAST_OPERATE_TIME:%s",userId);
// 获取上一次操作时间
Object lastTime = redisUtils.get(key);
// 保存本次操作时间
redisUtils.set(key, System.currentTimeMillis(), 60*1000L);
// 如果 上一次操作时间 不为空
if(null!=lastTime){
// 判断操作是否频繁
long duration = System.currentTimeMillis() - (long)lastTime;
if(duration <= 1000){
// 如果间隔一秒以内,则不允许此操作
throw new UserBusinessException(UserBusinessEnum.THE_OPERATION_IS_TOO_FREQUENT);
}
}