2016-05-29 13 views
1

Ich habe eine JSP-Seite mit einem Formular, wo Sie bestimmte Details ausfüllen. Beim Absenden des Formulars rufe ich ein Servlet auf, das dann die Details in einer Datenbank aktualisiert. Nachdem ich auf eine Seite umgeleitet habe, zeige ich eine Bestätigungsnachricht an den Benutzer an.So stoppen Sie das Absenden eines Formulars nach dem Klicken zurück Schaltfläche

Das Problem, das ich hier habe, ist, wenn der Benutzer zurück klickt, geht er wieder auf die Formularseite, wo, wenn er auf eine Schaltfläche Absenden klickt, erstellt er einen neuen Datensatz in der Datenbank.

Betrachten Sie dies ähnlich wie in einem Einkaufswagenbeispiel, wo er in diesem Fall den gleichen Artikel zweimal kaufen würde. Aber das einzige Problem hier ist, dass ich das im Backend nicht behandeln kann, d. H. Die Datenbank kann niemals wissen, dass eine redundante Operation stattfindet. Ich muss dies von der Client-Seite aus behandeln.Bit komisch, aber ich muss es so machen.

Grundsätzlich, wenn der Benutzer auf den Zurück-Button klickt, möchte ich nicht, dass er auf die Formularseite und möglicherweise nur auf eine andere Seite gehen kann.

Antwort

1

denke ich folgende Strömung ist die beste:

  • Client-Daten an den Server es
  • Servlet verarbeitet einreicht
  • Es gibt HTTP 303 zum Client umleiten
  • -Client leitet zum Erfolg Seite

Nach diesem Fluss, Aktualisieren, Zurück-Taste wird ordnungsgemäß funktionieren.

Für weitere Informationen lesen Simple Post-Redirect-Get code example

1

Sie könnten eine PRG-Pattern implementieren (https://en.wikipedia.org/wiki/Post/Redirect/Get) mit PHP.

Grundsätzlich leiten Sie das Formular nach erfolgreichem Absenden auf eine Bestätigungsseite um, die den Benutzer darüber informiert, dass die Einreichung erfolgreich war/akzeptiert wurde/etc. und legen Sie auch eine Variable fest, die Sie später verwenden können, um zu überprüfen, ob die Einreichung bereits gesendet wurde.

Wenn der Benutzer versucht, die Seite neu zu laden oder zurückzugehen, können Sie die Variable überprüfen und entweder das Formular erneut anzeigen oder die Bestätigungsseite anzeigen, wenn die Einreichung bereits gesendet wurde.

3

Dies ist eine typische HTML-Formular Ausgabe, können Sie es durch eines der folgenden Methoden

1) Server-Seite (Seite Expiration) lösen kann: Da Sie, dass die Seite aktualisiert erwähnt habe und geht in die Bestätigung. Sie können No-Cache festlegen und eine Seitenablaufzeit als -1 der Seite hinzufügen, auf der Sie das Formular haben. So, wenn Benutzer die Zurück-Taste drückt, wird er sehen, dass die Seite abgelaufen ist. Er wird gezwungen sein, die Seite frisch zu laden. Dies ist das Verhalten, das ich auf den meisten Banken-Websites sehe.

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

2) Verwenden der Key-Methode drehen: Wenn das Formular geladen wird, können Sie einen zufälligen Schlüssel in Sitzungsspeicher erzeugen und binde sie auch als versteckten Wert in der Seite. Überprüfen Sie während der Formularübermittlung den übermittelten versteckten Schlüssel anhand des Werts in der Sitzung. Falls vorhanden, fügen Sie den Eintrag zur Datenbank hinzu, andernfalls können Sie die Seite mit einem neuen Schlüssel für den Benutzer neu laden (der dies möglicherweise unbeabsichtigt getan hat).

In Lastenausgleichs- oder Webfarmen sollten Sie den Turn Key in Database für den aktuellen Benutzer beibehalten.

3) Clientseite (nicht empfohlen): Sie können die Verwendung der Zurückschaltfläche des Browsers einschränken, indem Sie die Seite aus dem Verlauf entfernen. (Ein Nebeneffekt ist, dass es die ganze Geschichte für den Browser-Tab/Fenster entfernen wird)

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

Wenn Sie die gleiche Unterstützung für älteren Browser benötigen, wo Push- und Pop-Staaten werden nicht unterstützt, können Sie folgenden Ausschnitt verwenden.

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

Bevor Umleitung auf die JSP-Seite diese Header mit der Antwort der Steuerung senden, so dass die Seite im Cache gespeichert ist und der Browser verlangt immer eine neue Seite vom Server.

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); 

Also jedes Mal, gehen Sie zurück zu dieser Seite eine neue Seite vom Server angefordert werden und wird mit den geräumten Eingabefeldern angezeigt werden.

Verwandte Themen