我们有一些搜索页面需要运行大量数据,并且需要一段时间才能完成。当用户单击搜索按钮时,我们希望不允许他们再次提交搜索结果。
在 JSF 中是否有进行“双击”检测/预防的最佳实践?
PrimeFaces 组件似乎可以做我们想要的事情,因为它会在单击搜索按钮和搜索完成之间的一段时间内禁用 UI,但是我们是否可以使用更通用的策略(也许不是)依赖 PrimeFaces)?理想情况下,在搜索完成之前,对该按钮的任何单击都将被禁用或忽略。我们不一定需要禁用整个 UI(因为 blockUI 允许您这样做)。
如果你只使用ajax请求,你可以使用jsf.ajax.addOnEvent
JSF JavaScript API 的处理程序。下面的例子将应用于所有按钮type="submit"
.
function handleDisableButton(data) {
if (data.source.type != "submit") {
return;
}
switch (data.status) {
case "begin":
data.source.disabled = true;
break;
case "complete":
data.source.disabled = false;
break;
}
}
jsf.ajax.addOnEvent(handleDisableButton);
或者,如果您仅在特定按钮上需要此功能,请使用onevent
的属性<f:ajax>
.
<h:commandButton ...>
<f:ajax ... onevent="handleDisableButton" />
</h:commandButton>
如果您还需要在同步请求上应用此功能,那么您需要考虑到当您在onclick
,然后按钮的name=value
对不会作为请求参数发送,因此 JSF 将无法识别该操作并调用它。因此你应该只禁用它after浏览器已发送 POST 请求。没有用于此目的的 DOM 事件处理程序,您需要使用setTimeout()
点击后约 50 毫秒禁用按钮。
<h:commandButton ... onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);" />
这只是相当脆弱。对于速度慢的客户端来说,它可能太短。您需要增加超时或转向其他解决方案。
也就是说,请记住,这只能防止通过网页提交时的重复提交。这并不能阻止编程式 HTTP 客户端的双重提交,例如URLConnection
、Apache HttpClient、Jsoup 等。如果您想在数据模型中强制执行唯一性,那么您不应该阻止重复提交,而应该阻止重复插入。这可以通过在 SQL 中轻松实现UNIQUE
对感兴趣的列的约束。
也可以看看:
- 用于防止重复提交的纯 Java/JSF 实现
- 如何在呈现响应之前处理多次提交?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)