# JSF: request nach ausführung killen?



## cylo (5. Nov 2006)

Hallo,

ich weiß nicht so recht wie ich mein problem beschreiben soll...also ich habe auf einer seite (nennen wir sie seite a)  ein ziemlich fettes formular welches über einen command-button abgeschickt wird. mit den formulardaten werden dann bestimmte datenbankabfragen und inserts gemacht. als abschluß wird der datensatz der gerade eingefügt wurde wieder selectiert um einige daten davon auf der nächsten seite b anzeigen zu lassen. soweit so gut. funktioniert alles. ich hab dann neulich mal aus durch zufall den reload-button des browsers betätigt und mußte feststellen das der request nochmal ausgeführt wird und somit auch der insert erneut vorgenommen wird, was natürlich unerwünscht ist. so mülle ich mir die datenbank ja mit doppelten und fehlerhaften (weil zwischen den selects und inserts noch berechnungen durchgeführt werden) datensätzen voll.
ich habe jetzt gehört das man sich selber darum kümmern muß dies zu unterbinden, also das der alte request nochmal ausgeführt wird. nur habe ich nicht wirklich eine idee wie ich das machen soll. habt ihr ne idee oder nen ansatz wie man das lösen kann? denn die betätigung des reload button wäre ein mächtiges problem für die anwendung. ???:L 


gruß,
cylo


----------



## KSG9|sebastian (6. Nov 2006)

Zeig mal ein bisschen Code...
Normalerweise wird dein Formular ja gepostet. Und das passiert "normalerweise" nicht wenn du die Seite aktualisierts.


----------



## cylo (6. Nov 2006)

Hallo,

mir wurde gesagt dass das bei jsf/jsp normal ist das beim seiten-aktualisieren der request nocheinmal abgeschickt wird...und das ich mich ebend selber darum kümmern muß. aber dann würde dieses problem ja fortwährend bestehen...:bahnhof: 

das ich mein formular-gerüst:


```
<body>
	<h:form id="addForm">
		<h3><h:outputText value="neuen Datensatz anlegen" /></h3>
		...viele Inputfelder...
		<h:commandButton value="löschen" type="reset" />
		<h:commandButton action="#{bean.add}" value="ONLINE-Benutzer anlegen" onclick="return checkAddForm();"/>
        </h:form>
</body>
```

die Funktion add macht dann berechnungen und inserts in eine Datenbank...

gruß,
cylo


----------



## cylo (6. Nov 2006)

Hallo nochmal,

habs gerade nochmal mit anderen Formularen getestet, die auf der zweiten seite nur infos ausgeben. jedes mal wenn ich einen refresh der seite mache werden die selects der action erneut ausgeführt. scheint also doch nicht so ungewöhnlich zusein. auf jedenfall ist es lästig bei inserts, wenn irgendein user mein er müsse mal den reload button betätigen.

gruß,
cylo


----------



## SlaterB (6. Nov 2006)

also ich sehe keinen Unterschied bzgl. Get und Post beim Reload-Problem,
sinnvolles Mittel dagegen:
nach der Bearbeitung einen Redirect ausführen,
dann kann man nicht mehr reloaden,

natürlich kann jemand zurück zur Formularseitr gehen und dieses nochmal abschicken, 
oder sich den Request per Hand zusammenbauen,
dagegen sollte man schon irgendwie gewappnet sein,

aber für Anfänger ist das nix, ist ja auch eher ein theoretisches Problem,


----------



## Terminator (6. Nov 2006)

Also das ist nicht nur bei JSF so, passiert auch bei Servlet, JSP, ...
Und auch net blos bei nem Reload, oft tritt das ein wenn User doppelt auf nen Button klicken.

Gibs verschiedene Ansätze zu:
Clientseitig: Mit kurzen Delay den Link per JS blocken oder Cursor Sanduhr
Serverseitig: Beliebigen Wert bei Formular Aufruf in Session legen und bei Ausführung prüfen/löschen, sodass nur erste Request läuft


Der Nachteil von JS ist halt, dass es nicht überall einsetzbar ist:
(Reload, Bots, WML, ...)

Der Nachteil von Serverseitig ist:
Da man wegen möglicherweise synchronen Ausführung der Requests nicht ermitteln kann, ob der parallel laufender Request1 auf nen Fehler gestossen ist oder erfolgreich durchgelaufen ist, kann man dem User, der ja Ergebnis von Request2 erhält, auch nicht Erfolg oder Fehler mitteilen.
Höchstens was allgemeines wie: Doppelter Request festgestellt - bitte sehen Sie nach ob Ihre Anfrage erfolgreich durchgeführt wurde


ziemlich blöde Geschichte


----------



## cylo (6. Nov 2006)

Hallo alle miteinander,

danke für die Antworten. Das mit dem flag in der session hört sich für mich noch mit am besten an...
Das mit dem redirect fänd ich nicht so prall denn da müßte ich jedesmal meine ergebnisdaten mir durchschleifen und die applikation besteht aus seeeehhhhr vielen  formularen. 

Wenn das generell ein Problem ist bei Servlets und co...wie wird damit umgegangen? ich meine es gibt 1000de solcher applikationen...wird das dann meist vernachlässigt? ich mein normaler weise sollte der fall "user klickt dopplet oder macht reload" nicht auftreten aber man weiß ja nie wie der user tickt  :wink: und muß alles ein planen...

wenn es nur db-selects sind die in der action ausgeführt werden stört es mich nicht großartig, aber bei insert isses ebend nicht so schön. ich hab schon überlegt ob ich nicht vielleicht auch bei den inserts prüfe ob der datensatz schon so vorhanden ist und dann dementspreched ne fehlermeldung rausbringe, aber das wäre ziemlich aufwendig...


mal noch ne andere frage...wie kann man sicher gehen das eine seite nicht aus dem browsercache geholt wird sonder immer vom server? irgendwas mit nem timestamp oder so sollte da doch möglich sein...

auf jeden fall danke besonders auch an terminator...btw. kann man sj-seitig den reload-button eines browsers ansprechen? wie sieht es da mit browserabhängigkeit aus?

gruß
cylo


----------



## Guest (6. Nov 2006)

> Wenn das generell ein Problem ist bei Servlets und co...wie wird damit umgegangen? ich meine es gibt 1000de solcher applikationen...wird das dann meist vernachlässigt? 

Hm - echt gute Frage.
Also viel ist ja PHP wird da net eh jeder Request komplett separat abgearbeitet.
Dann könnte man ja problemlos nachgucke in Session oder DB obs schon ausgeführt ist.
(kenn mich aber mit PHP null aus)

Also ich machs derzeit mit nem Filter und leite Folge-Request auf spezielle Errorseite.
Bin aber damit noch nicht voll glücklich.
Richtig wär halt dem User mitteilen zu können was aus Request 1 wurde.


> ich mein normaler weise sollte der fall "user klickt dopplet oder macht reload" nicht auftreten aber man weiß ja nie wie der user tickt  und muß alles ein planen... 

Vor paar Jährchen mal bei grösseres Shop hat Fachbereich gemeint kommen 600 Doppelbestellung pro Tag rein.
Hatte damals dann für die ne reine JS-Lösung reingehängt, sprich nur Bestelllink deaktviert.
Laut Fachbereich kamen dann nur noch einzelne rein.


> vielleicht auch bei den inserts prüfe ob der datensatz schon so vorhanden ist und dann dementspreched ne fehlermeldung rausbringe, aber das wäre ziemlich aufwendig... 

bringt nischt - oder sag wa wär auch nicht exakt.
Doppelrequest könnte reinkommen und erste Request hat noch nicht committet.


> mal noch ne andere frage...wie kann man sicher gehen das eine seite nicht aus dem browsercache geholt wird sonder immer vom server? irgendwas mit nem timestamp oder so sollte da doch möglich sein... 

Timestamp in die URL einbauen.



> kann man sj-seitig den reload-button eines browsers ansprechen

nö - musste halt etwas JS in die Seite hängen


----------

