我们正在使用 Wicket Wizard
组件。在向导的最后一步,我们发现如果用户快速单击完成按钮,Wicket 会多次调用我们的 onFinish()
方法。这给我们带来了问题。
有趣的是,这个问题出现在我们尝试过的所有浏览器(IE、Chrome)中,但 Firefox 中却没有。该浏览器似乎检测到多次点击,并且只向服务器发送一次点击事件。
问题是,我们可以采取什么措施来防止这种情况发生?
通过查看 Wicket 框架代码,我可以看到导航按钮包含在 WizardButtonBar
中,并且 FinishButton
正在处理 onClick
事件,但我不确定覆盖或控制此行为的正确方法,并以某种方式检测多个 onClick
事件
最佳答案
您似乎没有使用 Ajax,是吗?
如果你这样做了,你可以只添加面纱 - 例如通过覆盖#getAjaxIndicatorMarkupId()
- 任何双重提交都会被阻止。额外的好处:如果用户在向导完成后按下后退按钮,浏览器将离开向导并且用户无法再次完成它。
对于非 Ajax 请求,您必须将自己的 veil JavaScript 添加到按钮。
为了防止用户返回并再次完成向导,您可以使用基于 token 的解决方案:
在向导开始时获取一个 token (可能只是一个计数器)。向导完成后,将 token 标记为已用(例如,将其与域对象一起存储)。
对于向向导发出的每个请求,您可以检查 token 是否仍然有效 - 如果无效,请将用户重定向到另一个页面,说明向导已完成。
关于java - Wicket 7 - 向导完成按钮生成多个 onClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658230/