Seite eins enthält ein HTML-Formular. Seite zwei - der Code, der die übermittelten Daten verarbeitet.
Das Formular auf Seite eins wird gesendet. Der Browser wird auf Seite zwei umgeleitet. Seite zwei behandelt die übermittelten Daten.
Wenn zu diesem Zeitpunkt die zweite Seite aktualisiert wird, wird die Warnung "Erneute Übermittlung des Formulars bestätigen" angezeigt.
Kann das verhindert werden?
Antworten:
Es gibt zwei Ansätze, die hier verwendet werden:
Methode 1: Verwenden Sie AJAX + Redirect
Auf diese Weise veröffentlichen Sie Ihr Formular im Hintergrund mit JQuery oder ähnlichem wie Seite2, während der Benutzer weiterhin Seite1 anzeigt. Nach erfolgreicher Veröffentlichung leiten Sie den Browser auf Seite 2 um.
Methode 2: Post + Weiterleiten an sich selbst
Dies ist eine gängige Technik in Foren. Form on Page1 sendet die Daten an Page2, Page2 verarbeitet die Daten und führt die erforderlichen Schritte aus. Anschließend wird eine HTTP-Umleitung für sich selbst durchgeführt. Auf diese Weise ist die letzte "Aktion", an die sich der Browser erinnert, ein einfaches GET auf Seite 2, sodass das Formular bei F5 nicht erneut gesendet wird.
quelle
Sie müssen PRG - Post / Redirect / Get-Muster verwenden und haben gerade das P von PRG implementiert. Sie müssen umleiten .(Heute brauchen Sie überhaupt keine Umleitung mehr. Sehen Sie dies )PRG ist ein Webentwicklungs-Entwurfsmuster, das doppelte Formularübermittlungen verhindert, dh Formular senden (Post Request 1) -> Redirect -> Get (Request 2)
Statuscode umleiten - HTTP 1.0 mit HTTP 302 oder HTTP 1.1 mit HTTP 303
Eine HTTP-Antwort mit Umleitungsstatuscode enthält zusätzlich eine URL im Feld für den Standortheader. Der Benutzeragent (z. B. ein Webbrowser) wird durch eine Antwort mit diesem Code aufgefordert, eine zweite, ansonsten identische Anforderung an die im Standortfeld angegebene neue URL zu senden.
Der Umleitungsstatuscode soll sicherstellen, dass der Browser des Webbenutzers in dieser Situation die Serverantwort sicher aktualisieren kann, ohne dass die anfängliche HTTP-POST-Anforderung erneut gesendet wird.
Quelle
quelle
Direkt kann man nicht, und das ist gut so. Die Warnung des Browsers ist aus einem bestimmten Grund vorhanden. Dieser Thread sollte Ihre Frage beantworten:
Verhindern Sie, dass die Schaltfläche Zurück die POST-Bestätigungswarnung anzeigt
Zwei wichtige Problemumgehungen waren das PRG-Muster und eine AJAX-Übermittlung, gefolgt von einer Skripterstellung.
Beachten Sie, dass wenn Ihre Methode eine GET- und keine POST-Übermittlungsmethode zulässt, dies sowohl das Problem löst als auch besser zur Konvention passt. Diese Lösungen werden unter der Annahme bereitgestellt, dass Sie Daten POSTEN möchten / müssen.
quelle
Die einzige Möglichkeit, 100% ig sicher zu sein, dass dasselbe Formular niemals zweimal gesendet wird, besteht darin, in jedes von Ihnen ausgegebene Formular eine eindeutige Kennung einzubetten und zu verfolgen, welche auf dem Server gesendet wurden. Die Gefahr besteht darin, dass dasselbe Formular nicht funktioniert, wenn der Benutzer auf der Seite, auf der sich das Formular befand, ein Backup erstellt und neue Daten eingibt.
quelle
Die Antwort besteht aus zwei Teilen:
Stellen Sie sicher, dass doppelte Beiträge nicht mit Ihren Daten auf der Serverseite in Konflikt geraten. Betten Sie dazu eine eindeutige Kennung in den Beitrag ein, damit Sie nachfolgende Anforderungen serverseitig ablehnen können. Dieses Muster wird in Bezug auf Nachrichten als Idempotenter Empfänger bezeichnet .
Stellen Sie sicher, dass der Benutzer nicht durch die Möglichkeit von doppelten Einsendungen durch beide gestört wird
Nichts, was Sie unter 2. tun, verhindert doppelte Übermittlungen vollständig. Die Leute können sehr schnell klicken und Hacker können trotzdem posten. Sie benötigen immer 1., wenn Sie absolut sicher sein möchten, dass keine Duplikate vorhanden sind.
quelle
Wenn Sie eine Seite mit POST-Daten aktualisieren, bestätigt der Browser Ihre erneute Übermittlung. Wenn Sie GET-Daten verwenden, wird die Meldung nicht angezeigt. Sie können auch die zweite Seite nach dem Speichern der Übermittlung auf eine dritte Seite ohne Daten umleiten lassen.
quelle
Ich fand, dass niemand diesen Trick erwähnte.
Ohne Umleitung können Sie die Formularbestätigung beim Aktualisieren weiterhin verhindern.
Standardmäßig lautet der Formularcode wie folgt:
<form method="post" action="test.php">
Ändern Sie es jetzt in
<form method="post" action="test.php?nonsense=1">
Du wirst die Magie sehen.
Ich denke, das liegt daran, dass Browser das Popup für Bestätigungsalarme nicht auslösen, wenn sie eine GET-Methode (Abfragezeichenfolge) in der URL erhalten.
quelle
Sie können dies mit jquery tun
Dies ist die eleganteste Methode, um zu verhindern, dass Daten nach der Übermittlung aufgrund von Rückmeldungen erneut gesendet werden.
Hoffe das hilft.
quelle
Das PRG-Muster kann nur die erneute Übermittlung verhindern, die durch die Seitenaktualisierung verursacht wird. Dies ist keine 100% sichere Maßnahme.
Normalerweise werde ich die folgenden Maßnahmen ergreifen, um eine erneute Einreichung zu verhindern:
Client-Seite - Verwenden Sie Javascript, um doppelte Klicks auf eine Schaltfläche zu verhindern, die das Senden von Formularen auslösen. Sie können die Schaltfläche einfach nach dem ersten Klick deaktivieren.
Serverseitig - Ich berechne einen Hash für die übermittelten Parameter und speichere diesen Hash in der Sitzung oder Datenbank. Wenn also die doppelte Übermittlung empfangen wurde, können wir die Überschneidung erkennen und dann die richtige Antwort an den Client senden. Sie können jedoch auf der Clientseite einen Hash generieren.
In den meisten Fällen können diese Maßnahmen dazu beitragen, eine erneute Einreichung zu verhindern.
quelle
Ich mag die Antwort von @ Angelin wirklich. Wenn Sie jedoch mit Legacy-Code arbeiten, bei dem dies nicht praktikabel ist, funktioniert diese Technik möglicherweise für Sie.
Oben in der Datei
Halten Sie sich dann am Ende des Formulars
last_pos_sub
wie folgt fest:quelle
Versuchen Sie es mit tris:
Verwendung / Beispiel:
Schriftart: https://www.tutdepot.com/prevent-multiple-form-submission/
quelle
Verwenden Sie js, um das Hinzufügen von Daten zu verhindern:
quelle