我有一個很大的問題與Internet Explorer 7和8檢票 - Internet Explorer雙重提交
狀況:
我有建立一個醫療處方的形式。當我點擊保存按鈕時,腳本將DomainObject保存在數據庫上,並將名爲「saved」的布爾屬性(添加了表單的面板)設置爲true,並將byte []屬性設置爲byte。
在面板的RenderHead,我讀這個布爾,如果是真的,我強迫一個隱藏按鈕觸發與此代碼:
String js = "$('#" + printPDF.getMarkupId() + "').click();";
response.renderOnDomReadyJavaScript(js);
按鈕執行此代碼:
ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(new ByteArrayResourceStream(pdf, "application/pdf"));
handler.setFileName("foo.pdf");
RequestCycle.get().scheduleRequestHandlerAfterCurrent(handler);
此代碼完美適用於FF和Chrome。出現瀏覽器下載窗口,用戶可以將PDF保存在HD上。
不幸的是,Internet Explorer具有當網站需要下載內容時觸發的該死的安全行爲。該警告需要用戶驗證。一個黃色的條出現,用戶強制點擊「下載」。
screenshot http://imageshack.us/a/img198/1438/securityg.jpg
當我打下載文件,表單再次與我時,我打保存在第一時間準確的狀態提交。因此,以前沒有任何DB上的INSERT已經提交;會話重置爲以前的狀態等...
結果是對域Ojbect的DB上的雙重INSERT。
解決此問題的任何線索?
注意:如果在Internet Explorer安全設置中禁用了安全建議,則插入不會加倍。 – MrMime
最簡單的,雖然不是最乾淨的事情顯然是停止雙插入(例如通過記錄會話中最後插入的ID)。但是這聽起來很像IE錯誤,所以你的選擇可能是有限的。 – biziclop
不幸的是,如上所述,IE會保存會話的狀態,因爲它在第一次提交時保持不變,所以我在第一次和第二次提交之間在會話中設置的任何值都會丟失。我找到的唯一解決方案是生成一個唯一的特定字符串代碼(因此兩個DomainObject都生成相同的代碼)。在數據庫上設置一個UNIQUE列,並捕獲ORACLE異常。 – MrMime