0

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

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

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

4

2 回答 2

7

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

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

  • 令牌拦截

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

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

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

  • 令牌会话拦截

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

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

重要的 !

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

然后使用服务器端解决方案,如果你真的想要,也添加一个客户端保护......请记住,你需要仔细检查每一种可能的情况,不要在你的页面中出现禁用按钮后由于不可预见的结果,请求已结束(尤其是您标记的

于 2015-02-25T11:15:46.777 回答
0

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

在不存在的地方插入 - 没有主键

于 2015-02-25T08:12:19.433 回答