代码之家  ›  专栏  ›  技术社区  ›  Paolo Bergantino

如何在服务器端处理多个提交

  •  30
  • Paolo Bergantino  · 技术社区  · 16 年前

    我们都知道“禁用提交按钮”的老把戏,但在服务器端处理多个提交的最佳方法是什么?我有一个应用程序,它是绝对 批评的 表格只发送一次——它处理信用卡。我没有写它现在是怎样的,但是作为一个快速修复,我使用了提交时禁用的技术,但是一些不耐烦的禁用了javascript的用户仍然要支付两次费用。

    那么,有什么方法可以避免这种情况呢?我可以想出一些——我在过去用过一些——但我想看看是否有解决这个问题的“最佳实践”。我正在使用PHP,但我对概念更感兴趣。

    编辑: 我知道令牌技术,这是我在过去使用过的,这个问题或多或少是为了看看我的方法是否与其他优秀程序员使用的方法一致。

    6 回复  |  直到 16 年前
        1
  •  31
  •   RB.    16 年前

    一种真正有效的方法是随请求一起提交令牌,并保留已使用令牌的列表。如果令牌无效,或令牌已被处理,则中止。

        2
  •  10
  •   David    16 年前

    这通常是一个好主意,因为它还可以帮助您抵御XSS攻击。

        3
  •  8
  •   Keith Lawrence    16 年前

    您还可以简单地测试是否在最后一分钟(或第二分钟,取决于服务器的延迟)完成了相同的事务。大多数人不会在一分钟内用同一张卡片买两本相同的书(或任何东西)。如果你在最后一分钟保存了一个信用卡付款的缓存,并检查你将要支付的信用卡付款是否与你刚刚支付的信用卡付款相同(相同的卡号、相同的金额),那么你很可能会发现重复的信用卡付款。

        4
  •  3
  •   ripper234 Jonathan    16 年前

    正如其他人所说,令牌可以是递增整数(+用户名),也可以是GUID。

        5
  •  0
  •   Community CDub    7 年前

    我也有类似的问题。读完这篇文章后,我想买个代币也许是个不错的选择。 This post 显示了一个很好的实现示例。

        6
  •  -6
  •   Jake Wilson    13 年前

    不需要生成唯一的令牌和所有这些东西。表单验证通过后,只需将访问者重定向到另一个页面,上面写着“您的信用卡正在处理”。如果访问者重新加载页面,他们将重新加载重定向页面,而不是提交的帖子。