2014-04-25 27 views
14

我们在WebSphere V8.5使用JSF 2.0与几个组件库PrimeFaces 4.0,战斧2.0,RichFaces的,等纯Java/JSF实现双提交预防

我找了通用的机制,以避免形式刷新页面时重新提交,或再次单击提交按钮时。我有许多不同场景的应用程序。

现在我已经考虑用onclick属性中的一段JavaScript禁用按钮,但这并不令人满意。我正在为此寻找一个纯Java实现,就像Struts2 <s:token>一样。

+0

阿贾克斯是否来过的形式重新提交问题?因为只有页面的一部分呈现,而不是整个页面或重定向 – Sarz

+0

禁用onClick事件可能不会被sufissiant延时定时器需要做的伎俩 –

+0

是@NassimMOUALEK我实现按钮的禁用,直到阿贾克斯完成渲染 – Sarz

回答

17

我找的通用机制避免页面刷新时重新提交表格

对于有至少2个解决方案,不能组合:

  1. 执行后同步交重定向。这样刷新只会重新执行重定向的GET请求,而不是初始请求。缺点:您无法再使用请求范围来向最终用户提供任何反馈。 JSF 2.0通过提供新的flash scope解决了这个问题。另见How to show faces message in the redirected page

  2. 在后台异步执行POST(使用ajax)。这样刷新只会重新执行打开表单的初始GET请求。您只需确保这些表单最初仅通过GET请求打开,即,您绝不应该通过POST执行页面到页面导航(无论如何,这本身就是一个糟糕的设计)。另请参见When should I use h:outputLink instead of h:commandLink?


或当提交按钮被再次点击

对于有也基本上至少2解决方案,必要时可结合使用:

  1. Just block t他最终用户无法在提交期间和/或成功提交后按下提交按钮。这有多种方法,全部取决于具体的功能和设计要求。您可以在提交期间使用JavaScript来禁用按钮。您可以在提交后使用JSF的disabledrendered属性来禁用或隐藏按钮。另请参阅How to do double-click prevention in JSF 2。您还可以在处理ajax请求期间使用覆盖窗口来阻止任何最终用户交互。PrimeFaces有<p:blockUI>的目的。在服务器侧的新添加实体的

  2. 验证唯一性。如果您出于技术原因而不是出于功能原因绝对要避免重复,则这种方法更加稳健。这很简单:在有问题的数据库列上输入UNIQUE约束。如果违反了这个约束,那么DB(和JPA等数据库交互框架)将抛出违反约束的异常。这最好是与定制的JSF验证器结合使用,该验证器通过在该列上执行SELECT并检查是否没有记录返回来预先验证输入。 JSF验证器允许您以友好的面孔消息的风格显示问题。另请参阅Validate email format and uniqueness against DB

+0

布拉沃@BalusC非常有效点 – Sarz

+0

我使用''各种形式的我的应用程序,这'FlashScope'事情说成'重定向/ reload'页。我如何解决这个问题? – Sarz

+0

在“另请参见”链接中有一个示例。 – BalusC

3

您可以使用BalusC的解决方案来代替手动创建令牌。他his blog提出后重定向-GET模式

替代解决方案,可以在这些答案中找到:

+0

当我在h将:现在的commandButton它不是重新提交表单。它是否完全满足要求? – Sarz

+0

这已经由IT – Sarz

+0

的问题是更高的管理拒绝我们需要双提交根据我们的场景中启用和禁用。 – Sarz