我們在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