双击提交按钮时如何避免两次插入两个相同的记录?

我有一个弹出窗口,其中有两个onclick方法,如“Submit”和“Discard”。

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

我怎么能避免这个?

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

即使有很多解决方案,因为你已经将它标记为struts2 ,框架提供了两种开箱即用的方式来处理双重提交:

  • 令牌拦截器

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

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

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

  • 令牌会话拦截器

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

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

重要!

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

然后使用服务器端解决方案, 如果你真的想要 ,也要添加一个客户端保护…请记住,你需要仔细检查每个可能的情况,不要在你的页面中以一个禁用的按钮结束由于无法预料的结果,请求已结束(特别是对于您标记的ajax )。

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

插入不存在的位置 – 没有主键