2012-12-17 31 views
1

我有一個很大的問題與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。

解決此問題的任何線索?

+0

注意:如果在Internet Explorer安全設置中禁用了安全建議,則插入不會加倍。 – MrMime

+0

最簡單的,雖然不是最乾淨的事情顯然是停止雙插入(例如通過記錄會話中最後插入的ID)。但是這聽起來很像IE錯誤,所以你的選擇可能是有限的。 – biziclop

+0

不幸的是,如上所述,IE會保存會話的狀態,因爲它在第一次提交時保持不變,所以我在第一次和第二次提交之間在會話中設置的任何值都會丟失。我找到的唯一解決方案是生成一個唯一的特定字符串代碼(因此兩個DomainObject都生成相同的代碼)。在數據庫上設置一個UNIQUE列,並捕獲ORACLE異常。 – MrMime

回答

0

問題是,您單擊下載鏈接編程,而不是重定向瀏覽器到一個URL或通過JS window.open(url)打開一個URL。點擊一個鏈接看起來像一個有時被瀏覽器限制的不需要的操作。

相關問題