JSF Wie fängt man ein Reload ab?

Hallo Leute,

ich möchte verhindern, dass ein Formular durch ein reload der Seite ein zweites Mal abgeschickt wird.
Mein Ansatz wäre den reload als ActionEvent abzufangen und dann die Navigation umzuleiten.
Dies ist eine theoretische Überlegung, die ich jedoch beim googlen nicht gefunden habe, daher
könnte mir gut vorstellen, dass es bereits einen solchen Mechanismus gibt.
Kann mir jemand weiterhelfen?
 

brauner1990

Bekanntes Mitglied
Du könntest nachdem du das Formular abschickst, einen Wert setzen, welcher abgefragt wird, falls dieser gesetzt ist, verarbeitest du es nicht. Dieser könnte z.B. in einer Session stehen.
 
Das Problem löst du damit nicht, denn den Wert muss ich ja irgendwo setzen.
Der Benutzer kann dementsprechend mit Back wieder soweit zurückgehen bis dieser Wert wieder gesetzt ist. Da wäre das Abfangen von Reload-Anfragen elegNter.
 
N

nillehammer

Gast
Doch, der Ansatz von brauner1990 ist ein Möglicher. Nehmen wir als Beispiel ein Bestellungs-Bean, dass mit einem Formular verknüpft ist. Der User füllt die Bestellung aus und drückt auf Absenden. Im Bestellungsbean wird eine Status-Variable (ich nehm dafür selbst eine enum) von NEU auf EMPFANGEN umgesetzt. Ein Doppel-Submit würde dann abgefangen, weil Du auf den Status prüfen kannst.

Wenn die Bestellung nun vollständig abgearbeitet und z.B. in der Datenbank gespeichert ist. Kann der User natürlich eine neue Bestellung mit den exakt gleichen Daten eingeben (bzw. durch den Back-Button das Formular mit den Daten ansurfen). Das wäre dann aber eine komplett neue Bestellung. In der Regel willst Du das nicht verhindern. Falls doch, musst Du Dir überlegen, woran Du erkennst, dass es sich hier um die gleiche Bestellung handelt. Auf Java-Ebene wäre da equals() und hashCode() zu überschreiben. Auf DB-Ebene ein schlauer Unique-Constraint zu setzen.
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Mir ist grad noch eine Methode eingefallen. Diese wird auch gegen Session-Hijacking eingesetzt. Ich weiß aber leider den genauen Namen des Verfahrens nicht mehr. Deswegen hier stichpunkartig die Beschreibung:
- Erzeuge einen zufälligen hash-Wert. Merke ihn Dir auf Serverseite und generiere ihn als hidden field in das Formular.
- Werte den Post aus und vergleiche den geposteten Wert aus dem hidden field mit dem gemerkten. Sind sie gleich, war der Post gültig. Verarbeite die Daten ganz normal und verwirf den hash-Wert auf der Serverseite. Wenn der Nutzer nun mit dem Back-Button auf die Formularseite zurücksurft und nochmal Submit drückt, erkennst Du das, weil Du auf Serverseite keinen passenden Hashwert zu dem aus dem Post hast

In den gängigen Web-Frameworks wird dieses Pattern auch mit entsprechenden Komponenten unterstützt. Ich komm nur einfach nicht auf den Namen! :cry:
 
So etwas ähnliches habe ich mir auch überlegt, nur wollte ich einen Counter vergleichen, aber deine Methode ist definitiv besser. Habe zur Zeit ein wenig Zeitdruck, daher reicht mir im Moment erst einmal, dass der Eintrag nicht doppelt in die DB eingetragen wird. Zumindest das ist implementiert.
Ich denke aber das ich dieses Ansatz etwas später implementieren werde.

Vielen Dank
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Seiten-reload als Result einer Action Web Tier 3

Ähnliche Java Themen


Oben