【问题标题】:How to avoid inserting two same records twice when double-clicking the submit button? [duplicate]双击提交按钮时如何避免两次插入两条相同的记录? [复制]
【发布时间】:2015-04-27 03:37:44
【问题描述】:

我有一个弹出窗口,其中有两种 onclick 方法,即“提交”和“放弃”。

当我点击 提交 两次时,它会插入两条记录,这意味着重复记录。

我怎样才能避免这种情况?

【问题讨论】:

  • 客户端解决方案:第一次点击后禁用按钮...
  • @AleksandrM:我不同意 Struts2 标记的删除,问题是关于防止双重表单提交,Struts2 甚至有 两种 内置方法来做到这一点:)
  • @AndreaLigios:除了一堆标签,没有迹象表明 OP 实际上使用了 S2。不过好吧……我们拭目以待。
  • 这不是标签的原因吗? :|但是好的,BHAGATH SHIVARAM,您应该编辑您的问题,如果您使用的是 Struts2,请在文本中明确说明。 @RomanC,您链接的问答与语言无关,因此不会重复。我在 Q&A 中没有看到任何 Struts2 解决方案,是吗?

标签: java ajax struts2 double-submit-prevention double-submit-problem


【解决方案1】:

防止重复提交是一个常见问题。

尽管有很多解决方案,但由于您已将其标记为,因此框架提供了两种开箱即用的方法来处理重复提交:

  • Token Interceptor

    它返回一个invalid.token 结果,例如,可以映射到一个错误:

    确保每个令牌只处理一个请求。此拦截器可以确保后退按钮和双击不会造成意外的副作用。例如,您可以使用它来防止粗心的用户可能会双击“结帐”按钮在线商店。当发现无效令牌时,此拦截器使用一种相当原始的技术:它返回结果invalid.token,可以映射到您的操作配置中。更复杂的实现 TokenSessionStoreInterceptor 可以为找到无效令牌时提供更好的逻辑。

    注意:要在表单中设置令牌,您应该使用token tag。此标记是必需的,并且必须在提交到受此拦截器保护的操作的表单中使用。任何不提供令牌(使用令牌标签)的请求都将被视为带有无效令牌的请求。

  • Token Session Interceptor

    它基于令牌拦截器构建,但具有更高级和用户友好的行为,正是您所需要的:在双重表单提交的情况下,它呈现第一个的结果, 有效的请求,同时默默地吞下第二个(和后续的)请求:

    这个拦截器建立在 TokenInterceptor 之上,提供了处理无效令牌的高级逻辑。与普通令牌拦截器不同,此拦截器将尝试在使用同一会话的多个请求的情况下提供智能故障转移。也就是说,它将阻止后续请求,直到第一个请求完成,然后它不会返回 invalid.token 代码,而是尝试显示与原始有效操作调用相同的响应,如果没有多个首先提交了请求。

重要!

值得注意的是,exactly like for the Validation,像这样的服务器端解决方案应该是强制,而像仅使用 Javascript 禁用提交按钮这样的客户端解决方案是不够的。
如果用户使用 Firebug 重新启用按钮会怎样?如果他/她使用 Javascript 伪造请求怎么办?如果我在我的银行网站上并尝试发送两次请求(例如现金转账),那么它只被处理一次是至关重要的。

然后使用服务器端解决方案,如果您真的需要,也可以添加客户端保护...请记住,您需要仔细检查每种可能的情况,而不是由于不可预见的结果,请求结束后(尤其是您标记的 ),最终在您的页面中显示为禁用按钮。

【讨论】:

    【解决方案2】:

    您可以按照@Stefan 的建议阻止用户双击客户端,但如果您正在寻找一种方法来阻止它从后端/mysql 检查来自

    的答案

    Insert Where Not Exists-Without Primary Key

    【讨论】:

      猜你喜欢
      • 2017-01-24
      • 2017-05-23
      • 2017-06-06
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2012-07-26
      • 2021-08-02
      • 2019-04-07
      相关资源
      最近更新 更多