<form> nicht senden, wenn man in der History zurück geht
phpman
- php
0 EKKi- browser
0 phpman0 Sven Rautenberg0 phpman0 Der Martin
0 Sven Rautenberg
Hallo miteinander,
Ich habe eine Frage zu Formularen.
Ich habe eine Homepage programmiert, auf der ich quasi alle Links mit Formularen mache, jetzt habe ich aber das Problem, wenn der Client in der History zurück geht, dass er gefragt wird ob er die Daten nochmal senden möchte.
Ich habe leider im Netz keine Antworten darauf gefunden, weiß vielleicht jemand von euch wie ich das machen könnte, dass beim zurück gehen einfach automatisch die Daten nicht nochmal gesendet werden?
Danke + lg
phpman
Mahlzeit phpman,
Ich habe eine Homepage programmiert, auf der ich quasi alle Links mit Formularen mache,
Ein Link ist ein Link, ein Formular ist ein Formular - wieso nutzt Du das eine für das andere? Gibt es einen zwingenden Grund, das so zu machen?
jetzt habe ich aber das Problem, wenn der Client in der History zurück geht, dass er gefragt wird ob er die Daten nochmal senden möchte.
Ist das nicht nett vom Browser, dass er den Benutzer fragt, ob er die bereits einmal gesendeten Informationen nochmals versenden soll? Also ich als Benutzer möchte schon wissen, wenn mein Browser Daten (erneut) irgendwohin sendet ...
Ich habe leider im Netz keine Antworten darauf gefunden, weiß vielleicht jemand von euch wie ich das machen könnte, dass beim zurück gehen einfach automatisch die Daten nicht nochmal gesendet werden?
Verwende z.B. HTTPS - Daten, wie von einem Formular über eine verschlüsselte Verbindung gesendet wurden, speichern handelsübliche Browser im Normalfall nicht. Vielleicht funktioniert das, müsstest Du mal ausprobieren.
Ansonsten bleiben Dir AFAIK wenig andere Möglichkeiten - es ist das normale Verhalten eines Browsers, das Du als Seitenautor nicht beeinflussen kannst und darfst.
MfG,
EKKi
Aber gibt es keine Möglichkeit einfach die Daten nur beim ersten mal zu senden, also dem Browser zu erklären, dass er beim zurück gehen in der History, oder beim aktualisieren die Daten nicht mehr senden soll?
Moin!
Aber gibt es keine Möglichkeit einfach die Daten nur beim ersten mal zu senden, also dem Browser zu erklären, dass er beim zurück gehen in der History, oder beim aktualisieren die Daten nicht mehr senden soll?
Beim Wandern in der History sendet Opera keine erneuten Requests und stellt deshalb auch die Frage nicht.
Aber beim Aktualisieren, was vollkommen logisch ist:
Wird jetzt die dritte Seite aktualisiert, wiederholt der Browser einfach den GET-Request, lädt den eventuell erneuerten Seiteninhalt vom Server und zeigt ihn an.
Geht man in Opera zurück zur zweiten Seite, wird die einfach so angezeigt, wie sie war, als man sie verließ. Aber wird sie aktualisiert, dann wiederholt der Browser einfach den POST-Request, lädt den eventuell erneuerten Seiteninhalt vom Server und zeigt ihn an. Da POST-Requests aber üblicherweise dazu verwendet werden, auf dem Server Daten zu ändern, fragt der Browser vorher den Benutzer, ob das erneute Absenden des POST-Requests erwünscht ist.
Ginge man mit Opera zurück zur ersten Seite, würde das dortige Formular so angezeigt, wie es beim Abschicken des Formulars ausgesehen hat - also ausgefüllt. Wenn man die Seite aktualisiert, wiederholt der Browser einfach den GET-Request, lädt den eventuell erneuerten Seiteninhalt vom Server und zeigt ihn an. Das ist vermutlich ein leeres Formular.
Andere Browser verfügen nicht über so eine gute History-Funktion, sondern laden jede Seite automatisch neu, wenn man zurück geht. Dadurch wird sowohl der POST-Request automatisch wiederholt (und folgerichtig entsteht die Nachfrage), als auch das Formular auf Seite 1 automatisch wieder leer angezeigt.
Gegen dieses Browserverhalten ist serverseitig kein Kraut gewachsen - man muß annehmen, dass der Benutzer durch die Wahl seines Browsers solch ein Verhalten eben wünscht - ansonsten hätte er einen besseren Browser genommen... :)
- Sven Rautenberg
Danke für so eine Ausführliche Antwort,
aber ich glaube immer noch an ein Schlupfloch.
Ich habe z.B. mal irgendwo gelesen, dass man mit window.location.replace(window.location.href); die Seite Clientseitig neu laden kann, und damit das <form> umgehen.
Leider habe ich es noch nicht geschafft, dass die Seite dann wirklich nur einmal neu geladen wird, sondern dauererhaft.
lg
Moin!
Danke für so eine Ausführliche Antwort,
aber ich glaube immer noch an ein Schlupfloch.
Was denn für ein Schlupfloch?
Ich habe z.B. mal irgendwo gelesen, dass man mit window.location.replace(window.location.href); die Seite Clientseitig neu laden kann, und damit das <form> umgehen.
Damit greifst du in dramatischer Weise in eine elementare Funktion des Browsers ein, die jeder Benutzer erwartet - und senkst damit die Benutzbarkeit deiner Webseite.
Ich rate von solchen Spielchen dringend ab.
- Sven Rautenberg
ok, auch wenn du mir abrätst, wäre es denn rein theoretisch möglich?
Ich habe bereits über 30 Tausend zeilen Quelltext, ich kann jetzt nicht mehr alle formulare (vermutlich über 100) ändern.
Bitte Hilf mir.
Hallo,
Andere Browser verfügen nicht über so eine gute History-Funktion, sondern laden jede Seite automatisch neu, wenn man zurück geht.
das ist das Verhalten, das ich erwarten und auch wünschen würde. In der History vor- oder zurückgehen heißt für mich, die dort gespeicherten URLs wieder abzurufen - ebenso wie ich beim Reload/Refresh auch erwarte, dass die aktuell geladene Seite neu geladen wird.
Dadurch wird sowohl der POST-Request automatisch wiederholt (und folgerichtig entsteht die Nachfrage), als auch das Formular auf Seite 1 automatisch wieder leer angezeigt.
So soll es ja auch sein.
So long,
Martin
Moin!
Andere Browser verfügen nicht über so eine gute History-Funktion, sondern laden jede Seite automatisch neu, wenn man zurück geht.
das ist das Verhalten, das ich erwarten und auch wünschen würde. In der History vor- oder zurückgehen heißt für mich, die dort gespeicherten URLs wieder abzurufen - ebenso wie ich beim Reload/Refresh auch erwarte, dass die aktuell geladene Seite neu geladen wird.
Kann ja sein, dass du dieses andere Verhalten besser findest - mir hat das konservierende Verhalten des Opera allerdings schon so manches Forumsposting gerettet, welches sich bislang nur in der Textarea befand. :)
- Sven Rautenberg
Moin!
Ich habe leider im Netz keine Antworten darauf gefunden, weiß vielleicht jemand von euch wie ich das machen könnte, dass beim zurück gehen einfach automatisch die Daten nicht nochmal gesendet werden?
Verwende z.B. HTTPS - Daten, wie von einem Formular über eine verschlüsselte Verbindung gesendet wurden, speichern handelsübliche Browser im Normalfall nicht. Vielleicht funktioniert das, müsstest Du mal ausprobieren.
Ansonsten bleiben Dir AFAIK wenig andere Möglichkeiten - es ist das normale Verhalten eines Browsers, das Du als Seitenautor nicht beeinflussen kannst und darfst.
Ich habe meine Zweifel, ob HTTPS an diesem Vorgang etwas ändern würde. Die Frage, ob die gesendeten Daten nochmal gesendet werden sollen, tritt ausschließlich bei POST-Formularen an, und zwar exakt dann, wenn der Browser die durch den früher stattgefundenen POST-Request geladene Seite erneut laden soll. Bei GET-Formularen hingegen lädt der Browser einfach die abgefragte URL (in der sich als Parameter ja alle Formulardaten befinden) ohne Nachfrage neu.
Die Abfrage beim POST-Request erscheint mutmaßlich deshalb, weil POST üblicherweise bei datenverändernden Aktionen eingesetzt wird, und der Benutzer eine Einflußmöglichkeit erhalten soll, diese erneute Aktion zu verhindern.
Wirklich vernünftige Browser hingegen implementieren die History-Funktionalität "vernünftig" und senden beim Zurück- und Vor-Gehen keinerlei neue Requests ab, sondern zeigen die jeweilige Seite (und insbesondere eventuell ausgefüllte Formulare) exakt so an, wie die Seite war, als sie (wodurch auch immer) verlassen wurde.
Da es sich hier also um einen Konflikt bzw. eine Divergenz der Browserimplementierung hinsichtlich der History-Funktion handelt, gibt es keinen allgemeinen Lösungsansatz - außer natürlich, POST-Formulare unbedingt zu vermeiden, außer man will datenverändernde Requests an den Server schicken.
Als Paradebeispiel für eine gute History-Implementierung ist übrigens Opera erwähnt. Der leistet all das, was ich oben erwähnte.
- Sven Rautenberg