关于防止重复提交的方法

参考:

(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);
      }
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值