2016-05-29 82 views
1

我有一個JSP頁面,填寫某些細節的表單。在提交表單後,我調用一個servlet,然後更新數據庫中的詳細信息,然後我重定向到一個頁面,向用戶顯示一條確認消息。如何停止重新提交表單後點擊返回按鈕

我在這裏遇到的問題是當用戶點擊回到他再次進入表單頁面時,如果他點擊提交按鈕,它會在數據庫中創建一個新記錄。

考慮類似於購物車的例子,在這種情況下,他會購買兩次相同的物品。但唯一的問題是我無法在後端處理這個問題,即數據庫永遠不會知道發生了多餘的操作。 我需要從客戶端處理這一點。位奇怪,但我必須這樣做。

基本上,當用戶點擊後退按鈕時,我不希望他能夠轉到表單頁面,並可能只是到其他頁面。

回答

1

我覺得下面的流程是最好的:

  • 客戶端提交的數據到服務器
  • servlet處理它
  • 它返回HTTP 303重定向到客戶端
  • 客戶端重定向到成功頁面

經過此流程後,刷新,後退按鈕將正常工作。

欲瞭解更多信息,請閱讀Simple Post-Redirect-Get code example

1

您可以實現了使用PHP的PRG-模式(https://en.wikipedia.org/wiki/Post/Redirect/Get)。

基本上,成功提交表單後,您將重定向到一個確認頁面,通知用戶他們的提交已成功/已接受/等。並設置一個變量,您可以稍後使用它來檢查提交的提交是否已提交。

當用戶嘗試重新加載所述頁面或返回時,可以檢查該變量,並根據提交是否已提交,再次顯示錶單或確認頁面。

3

這是一個典型的HTML表單的問題,你可以解決它通過以下方法

1)服務器端(網頁過期)任何一個:既然你提到了頁面刷新並轉到確認。您可以設置no-cache並將頁面過期時間添加爲-1,以使您擁有該表單。 因此,當用戶按下後退按鈕時,他會看到該頁面已過期。他將被迫加載新鮮的頁面。這是我在大多數銀行網站上看到的行爲。

Response.Buffer = True 
Response.ExpiresAbsolute = Now() - 1 
Response.Expires = 0 
Response.CacheControl = "no-cache" 

2)使用交鑰匙方法:加載窗體時,您可以生成會話內存隨機密鑰,並把它嵌入在頁面中的隱藏價值。 在表單提交過程中,根據會話中的值檢查提交的隱藏鍵。如果存在,則將該條目添加到數據庫中,否則您可以使用新密鑰爲用戶重新加載頁面(誰可能無意中這樣做了)。

在負載平衡或Web羣,考慮堅持以數據庫根據當前用戶交鑰匙。

3)客戶端(不推薦):您可以通過從歷史記錄中刪除頁面來限制用戶使用瀏覽器後退按鈕。 (一個副作用是,它會刪除整個歷史爲這個瀏覽器標籤/窗口)

history.pushState(null, null, document.title); 
window.addEventListener('popstate', function() { 
    history.pushState(null, null, document.title); 
}); 

如果你需要一個push和pop狀態不支持舊的瀏覽器同樣的支持,您可以使用下面的代碼片段。

<script> 
    function preventBack() { 
    window.history.forward(); 
    } 
    setTimeout("preventBack()", 0); 
    window.onunload = function() { 
    null 
    }; 
</script> 
1

重定向到JSP頁面之前從控制器發送響應這些標題讓頁面不存儲在緩存中,瀏覽器將始終從服務器請求一個新的頁面。

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
response.setDateHeader("Expires", 0); 

因此,每當您返回該頁面時,服務器都會請求一個新頁面,並且將顯示已清除的輸入字段。

相關問題