webentwicklung-frage-antwort-db.com.de

Verhindern, dass die Zurück-Schaltfläche angezeigt wird POST Bestätigungsmeldung

Ich habe eine Anwendung, die eine lange Liste von Parametern für eine Webseite bereitstellt. Daher muss ich anstelle von GET POST verwenden. Das Problem ist, dass Firefox eine Warnung anzeigt, wenn die Seite angezeigt wird und der Benutzer auf die Schaltfläche Zurück klickt. 

Um diese Seite anzuzeigen, muss Firefox Informationen senden, mit denen alle zuvor durchgeführten Aktionen (z. B. Suche oder Auftragsbestätigung) wiederholt werden.

Da die Anwendung so aufgebaut ist, dass das Zurückgehen ein üblicher Vorgang ist, ist dies für Endbenutzer wirklich ärgerlich.

Grundsätzlich möchte ich es so machen, wie es diese Seite tut:

 http://www.pikanya.net/testcache/

Geben Sie etwas ein, senden Sie und klicken Sie auf die Schaltfläche Zurück. Keine Warnung, es geht einfach zurück.

Googeln Ich habe herausgefunden, dass dies ein Fehler in Firefox 3 sein könnte, aber ich würde dieses Verhalten auch irgendwie erhalten, nachdem sie es "behoben" haben. 

Ich denke, es könnte mit einigen HTTP-Headern möglich sein, aber welche genau?

39
Milan Babuškov

Eine Möglichkeit besteht darin, die POST auf eine Seite umzuleiten, die zu einem GET weiterleitet - siehe Post/Redirect/Get auf Wikipedia .

Angenommen, Ihr POST besteht aus 4K Formulardaten. Vermutlich macht Ihr Server etwas mit diesen Daten, anstatt sie nur einmal anzuzeigen und wegzuwerfen, beispielsweise in einer Datenbank zu speichern. Machen Sie das weiter, oder erstellen Sie in einem umfangreichen Suchformular eine temporäre Kopie davon in einer Datenbank, die nach einigen Tagen oder auf LRU-Basis gelöscht wird, wenn ein Speicherplatzlimit verwendet wird. Erstellen Sie nun eine Darstellung der Daten, auf die mit GET zugegriffen werden kann. Wenn es temporär ist, generieren Sie eine ID und verwenden Sie diese als URL. Wenn es sich um einen permanenten Datensatz handelt, hat er wahrscheinlich eine ID oder etwas, das für die URL verwendet werden kann. Im schlimmsten Fall kann ein Algorithmus wie die winzige URL eine große URL auf eine viel kleinere URL reduzieren. Leiten Sie das POST um, um die Darstellung der Daten zu erhalten.


Als historische Anmerkung war diese Technik etablierte Praxis 1995 .

27
Pete Kirkham

Sehen Sie meine goldene Regel der Webprogrammierung hier:

Stoppen Sie das Einfügen von Daten in eine Datenbank zweimal

Darin heißt es: „Antworte niemals mit einem Körper auf eine POST-Anfrage. Machen Sie immer die Arbeit und antworten Sie mit einem Location: -Header, um auf die aktualisierte Seite umzuleiten, damit der Browser sie mit GET anfordert.

Wenn der Browser den Benutzer nach einem erneuten POST fragt, ist Ihre Web-App defekt. Benutzer sollten diese Frage niemals sehen.

37
Ilya Birman

Eine Möglichkeit, diese Warnung/dieses Verhalten zu vermeiden, besteht darin, den POST über AJAX auszuführen und den Benutzer auf eine andere Seite zu schicken (oder nicht).

3
Sparr

Ich habe die Session-Variable verwendet, um in dieser Situation zu helfen. Hier ist die Methode, die ich benutze und die seit Jahren für mich funktioniert:

//If there's something in the POST, move it to the session and then redirect right back to where we are
if ($_POST) {
    $_SESSION['POST']=$_POST;
    redirect($_SERVER["REQUEST_URI"]);
}

//If there's something in the SESSION POST, move it back to the POST and clear the SESSION POST
if ($_SESSION['POST']) {
    $_POST=$_SESSION['POST'];
    unset($_SESSION['POST']);
}

Technisch müssen Sie es nicht einmal in eine Variable namens $ _POST zurücklegen. Aber es hilft mir zu verfolgen, welche Daten woher gekommen sind.

2
rgbflawed

Ich habe eine Anwendung, die eine lange Liste von Parametern für eine Webseite bereitstellt. Daher muss ich anstelle von GET POST verwenden. Das Problem ist, dass Firefox eine Warnung anzeigt, wenn die Seite angezeigt wird und der Benutzer auf die Schaltfläche Zurück klickt.

Ihre Begründung ist falsch. Wenn die Anfrage ohne Nebenwirkungen ist, sollte es GET sein. Wenn es Nebenwirkungen hat, sollte es POST sein. Die Auswahl sollte nicht auf der Anzahl der Parameter basieren, die Sie übergeben müssen.

1
troelskn

Als weitere Lösung können Sie die Weiterleitung überhaupt nicht mehr verwenden.

Sie können das Verarbeitungsergebnis sofort ohne POST-Bestätigungsmeldung verarbeiten und rendern. Sie sollten nur das Browser-Verlaufsobjekt bearbeiten:

history.replaceState("", "", "/the/result/page")

Siehe vollständige oder kurze Antworten

0
Eugen Konkov