我们在WebSphere V8.5使用JSF 2.0与几个组件库PrimeFaces 4.0,战斧2.0,RichFaces的,等纯Java/JSF实现双提交预防
我找了通用的机制,以避免形式刷新页面时重新提交,或再次单击提交按钮时。我有许多不同场景的应用程序。
现在我已经考虑用onclick
属性中的一段JavaScript禁用按钮,但这并不令人满意。我正在为此寻找一个纯Java实现,就像Struts2 <s:token>
一样。
我们在WebSphere V8.5使用JSF 2.0与几个组件库PrimeFaces 4.0,战斧2.0,RichFaces的,等纯Java/JSF实现双提交预防
我找了通用的机制,以避免形式刷新页面时重新提交,或再次单击提交按钮时。我有许多不同场景的应用程序。
现在我已经考虑用onclick
属性中的一段JavaScript禁用按钮,但这并不令人满意。我正在为此寻找一个纯Java实现,就像Struts2 <s:token>
一样。
我找的通用机制避免页面刷新时重新提交表格
对于有至少2个解决方案,不能组合:
执行后同步交重定向。这样刷新只会重新执行重定向的GET请求,而不是初始请求。缺点:您无法再使用请求范围来向最终用户提供任何反馈。 JSF 2.0通过提供新的flash scope解决了这个问题。另见How to show faces message in the redirected page。
在后台异步执行POST(使用ajax)。这样刷新只会重新执行打开表单的初始GET请求。您只需确保这些表单最初仅通过GET请求打开,即,您绝不应该通过POST执行页面到页面导航(无论如何,这本身就是一个糟糕的设计)。另请参见When should I use h:outputLink instead of h:commandLink?
或当提交按钮被再次点击
对于有也基本上至少2解决方案,必要时可结合使用:
Just block t他最终用户无法在提交期间和/或成功提交后按下提交按钮。这有多种方法,全部取决于具体的功能和设计要求。您可以在提交期间使用JavaScript来禁用按钮。您可以在提交后使用JSF的disabled
或rendered
属性来禁用或隐藏按钮。另请参阅How to do double-click prevention in JSF 2。您还可以在处理ajax请求期间使用覆盖窗口来阻止任何最终用户交互。PrimeFaces有<p:blockUI>
的目的。在服务器侧的新添加实体的
验证唯一性。如果您出于技术原因而不是出于功能原因绝对要避免重复,则这种方法更加稳健。这很简单:在有问题的数据库列上输入UNIQUE
约束。如果违反了这个约束,那么DB(和JPA等数据库交互框架)将抛出违反约束的异常。这最好是与定制的JSF验证器结合使用,该验证器通过在该列上执行SELECT
并检查是否没有记录返回来预先验证输入。 JSF验证器允许您以友好的面孔消息的风格显示问题。另请参阅Validate email format and uniqueness against DB。
您可以使用BalusC的解决方案来代替手动创建令牌。他his blog提出后重定向-GET模式
替代解决方案,可以在这些答案中找到:
阿贾克斯是否来过的形式重新提交问题?因为只有页面的一部分呈现,而不是整个页面或重定向 – Sarz
禁用onClick事件可能不会被sufissiant延时定时器需要做的伎俩 –
是@NassimMOUALEK我实现按钮的禁用,直到阿贾克斯完成渲染 – Sarz