联系人列表为空,请先登录
我有一个弹出窗口,其中有两个 onclick 方法,分别是“提交”和“丢弃”。
当我单击提交两次时,它会插入两条记录,这意味着重复记录。
我怎样才能避免这种情况?
防止重复提交是一个常见问题。
即使有很多解决方案,因为你已经标记了它 支柱2,框架提供了两种开箱即用的方法来处理双重提交:
invalid.token例如,它返回一个可以映射到错误的结果:
invalid.token
确保每个令牌只处理一个请求。这个拦截器可以确保后退按钮和双击不会导致意外的副作用。例如,您可以使用它来防止粗心的用户在网上商店双击“结帐”按钮。当发现无效令牌时,此拦截器使用一种相当原始的技术:它返回 result invalid.token,该结果可以映射到您的操作配置中。更复杂的实现 TokenSessionStoreInterceptor 可以为发现无效令牌提供更好的逻辑。 注意:要在表单中设置令牌,您应该使用token tag. 此标记是必需的,并且必须在提交给此拦截器保护的操作的表单中使用。任何不提供令牌(使用令牌标签)的请求都将作为具有无效令牌的请求进行处理。
确保每个令牌只处理一个请求。这个拦截器可以确保后退按钮和双击不会导致意外的副作用。例如,您可以使用它来防止粗心的用户在网上商店双击“结帐”按钮。当发现无效令牌时,此拦截器使用一种相当原始的技术:它返回 result invalid.token,该结果可以映射到您的操作配置中。更复杂的实现 TokenSessionStoreInterceptor 可以为发现无效令牌提供更好的逻辑。
注意:要在表单中设置令牌,您应该使用token tag. 此标记是必需的,并且必须在提交给此拦截器保护的操作的表单中使用。任何不提供令牌(使用令牌标签)的请求都将作为具有无效令牌的请求进行处理。
token tag
它建立在令牌拦截器的基础上,但具有更高级和用户友好的行为,这正是您所需要的:在双重表单提交的情况下,它呈现第一个有效请求的结果,同时默默地吞下第二个(以及随后的)请求:
这个拦截器建立在 TokenInterceptor 的基础上,提供了处理无效令牌的高级逻辑。与普通的令牌拦截器不同,此拦截器将尝试在使用同一会话的多个请求的情况下提供智能故障转移。也就是说,它将阻塞后续请求,直到第一个请求完成,然后invalid.token它不会返回代码,而是尝试显示与原始有效操作调用相同的响应,如果在第一个请求中没有提交多个请求地方。
值得注意的是,与 Validation 完全一样,像这样的服务器端解决方案应该是强制性的,而像仅使用 Javascript 禁用提交按钮这样的客户端解决方案是不够的。如果用户使用 Firebug 重新启用按钮会怎样?如果他/她使用 Javascript 伪造请求怎么办?如果我在我的银行网站上尝试发送请求两次(例如现金转账),那么它只被处理一次是至关重要的。
然后使用服务器端解决方案,如果你真的想要,也添加一个客户端保护......记住你需要仔细检查每一个可能的情况,不要在你的页面结束后出现一个禁用按钮请求结束(尤其是阿贾克斯,您标记的)由于不可预见的结果。
您可以按照@Stefan 的建议阻止用户双击客户端,但是如果您正在寻找一种方法来阻止它从后端/mysql 检查答案
在不存在的地方插入 - 没有主键
防止重复提交是一个常见问题。
即使有很多解决方案,因为你已经标记了它 支柱2,框架提供了两种开箱即用的方法来处理双重提交:
该令牌拦截
invalid.token
例如,它返回一个可以映射到错误的结果:该令牌会话拦截
它建立在令牌拦截器的基础上,但具有更高级和用户友好的行为,这正是您所需要的:在双重表单提交的情况下,它呈现第一个有效请求的结果,同时默默地吞下第二个(以及随后的)请求:
重要的 !
值得注意的是,与 Validation 完全一样,像这样的服务器端解决方案应该是强制性的,而像仅使用 Javascript 禁用提交按钮这样的客户端解决方案是不够的。
如果用户使用 Firebug 重新启用按钮会怎样?如果他/她使用 Javascript 伪造请求怎么办?如果我在我的银行网站上尝试发送请求两次(例如现金转账),那么它只被处理一次是至关重要的。
然后使用服务器端解决方案,如果你真的想要,也添加一个客户端保护......记住你需要仔细检查每一个可能的情况,不要在你的页面结束后出现一个禁用按钮请求结束(尤其是阿贾克斯,您标记的)由于不可预见的结果。