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