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