dedlfix: Code schnipsel selber schreiben

Beitrag lesen

echo $begrüßung;

Jetzt würde ich auch gerne ohne umleitung arbeiten aber wie kann ich das POST Cache leeren?

Ganz ohne Umleitung wird es leider nicht gehen. Der Trick mit der Umleitung wird verwendet, um die POST-Seite unschädlich zu machen. Du hast diese Reihenfolge:

GET Formular
  POST Formular
  GET andere verlinkte Seite, aufgerufen durch beliebige weitere Benutzeraktivität

Wenn der Benutzer auf dem zweiten GET ist, soll er nicht mehr mit der Zurück-Funktion auf die POST-Seite kommen, weil dadurch die Abfrage kommt, ob das Formular noch einmal gesendet werden soll, und das auch passiert, wenn der Benutzer das bejaht. Die Umleitung sorgt dafür, dass aus dem POST beim Browser ein GET wird.

GET Formular
  <del>POST Formular</del><ins>GET Umleitungsziel</ins>
  GET andere verlinkte Seite

Beim Zurück gelangt man nun nur noch auf GET-Seiten, die keine datenverändernden Aktion mehr auf dem Server auslösen.

Der Benutzer wird aber trotz Umleitung nicht gehindert, bis zum ersten GET zurückzugehen und es noch einmal abzusenden. Auch hilft das Umleiten nicht beim Affenformular, wenn der Affe Fehler gemacht hat.

GET Formular
  POST Formular (mit Fehlern)
  <del>POST Formular (alles richtig)</del><ins>GET Umleitungsziel</ins>
  GET andere verlinkte Seite

Es bleibt ein POST (oder auch mehrere, je nach Intelligenz des Affen :-) stehen, das nicht durch Umleitung entschärft wurde. Diese POSTs auch in ein GET umzuleiten hat den Nachteil, dass die fehlerhaften Werte in der GET-Seite als Eingabefeldvorbelegung eingetragen werden müssen, und das zusammen mit dem Hinweis auf Fehler. Doch das will man ja meist ebenfalls vermeiden. Der Browser soll sich nur ein leeres Formular merken.

Die Sachlage ist also komplex und nicht einfach zu lösen. Deshalb ist so eine Umleitung nicht immer die beste und alle Probleme lösende Wahl. Und Umleititis wird es in meinen Augen dann, wenn sie dazu dient, unterschiedlichen Inhalt auszuliefern, nur weil es dem Autor einfacher erscheint, komplette Seiten zu erstellen, statt mit einer Fallunterscheidung den jeweils auszuliefernden Inhalt einzubetten.

Die Frage sollte also lauten: Ist es wirklich und unbedingt erforderlich, ein mehrfaches Absenden zu verhindern? Richtet es überhaupt Schaden an, oder ist es gar nur ein verschmerzbarer Schönheitsfehler? Das Gebilde mit der Umleitung ist eins, bei dem der Client mitspielen muss. Tut er es nicht, hast du ein Loch in deiner Sicherung gegen Mehrfachausführung.

Wenn ein mehrmaliges Abarbeiten des Formulars nicht erfolgen darf, so ist es besser, einen serverseitigen Mechanismus zu implementieren, den der Client nicht torpedieren kann. Bei "GET formular" wird ein einmaliger, ausreichend eindeutiger Zufallswert ermittelt und sowohl in einem Feld des Formulars als auch in der Session abgelegt. Beim Verarbeiten des POST-Request werden beide Werte miteinander verglichen und der in der Session gelöscht. Bei einem erneuten POST sind die Werte nicht mehr gleich, denn der in der Session ist ja nicht mehr da. Nun kann der Benutzer auch wieder bis zum GET zurückgehen und das Formular von dort aus neu zu versenden versuchen, was ihm nicht gelingen wird, weil da ja der Browser noch die Version mit dem alten Zufallswert im Cache hat. Erst ein neuer Request nach dieser Seite erzeugt einen neuen, gültigen Zufallswert, oder auch nicht, wenn das gemäß Anwendungslogik nicht sein soll.

Abschließend sollte mindestens das GET-Formular den Browser bitten, nicht gecachet zu werden. Bei einem Zurück wird es der Browser aus seinem/r Cache/History nehmen, denn dabei erfolgt meistens kein neuer Request. Aber bei einem normalen Link-Aufruf wird das Expires-Datum ausgewertet und die Seite neu abgerufen, was ja für die Bildung eines neuen Zufallswertes erforderlich ist.

echo "$verabschiedung $name";