# URL - Params entfernen



## rolf (12. Jul 2007)

Aus einem Formular senden ich Daten an ein Servlet, das die Daten in die DB schreibt. Anschliessend wird noch eine Bestätigungsseite mit den gespeicherten Daten angezeigt. So weit, so gut. 

Nun, wenn ich jetzt auf das Refresh-Icon klicke, wird der ganze Datensatz noch einmal in die DB geschrieben und die ID natürlich um Eins erhöht. Und, das ärgert mich ... 

Nun, die Bestätigungsseite bekommt die Bean im request-Scope und liest die Daten aus. Somit sind alle Parameter im URL vorhanden (ich arbeite zur Zeit mit METHOD="GET"). Wie kann ich es verhindern, dass die Daten noch einmal geschrieben werden? 

Mit <c:remove ... Bean scope="request"/> hat es auch nicht geklappt. Kann man so was "elegant" lösen?

Danke für jeden Tipp.


----------



## cr4ch (12. Jul 2007)

Moin moin

Ich persönlich mach das normalerweise über ein "redirect"

Gruss


----------



## rolf (12. Jul 2007)

cr4ch hat gesagt.:
			
		

> Moin moin
> 
> Ich persönlich mach das normalerweise über ein "redirect"
> 
> Gruss



Wie meinst du das mit "redirect"! Wo, woher, wohin?


----------



## SlaterB (12. Jul 2007)

das Problem liegt beim Browser, der zeigt die letzte Anfrage im Adress-Fenster an,
da kannst du auf Server-Seite nix zu machen,

mit einem Redirect sagst du dem Browser,
dass er eine neue Seite anzeigen soll
statt 
http://get?x=y;
nun
http://showresults;

dann steht http://showresults; in der Adress-Zeile und ein Reload ist gefahrlos


----------



## rolf (12. Jul 2007)

SlaterB hat gesagt.:
			
		

> das Problem liegt beim Browser, der zeigt die letzte Anfrage im Adress-Fenster an,
> da kannst du auf Server-Seite nix zu machen,
> 
> mit einem Redirect sagst du dem Browser,
> ...



Ich komme leider immer noch nicht ganz draus, was du meinst. 

- Wo kommt "redirect" rein? In mein Bestätigung-JSP! Oder in Servlet! Oder, muss ich Headerdaten des User-Agents anpassen?

Wäre froh, wenn du mir eine Codezeile schreiben würdest, damit ich besser verstehe, wie du es meinst.


----------



## SlaterB (12. Jul 2007)

das Servlet schickt den Redirct anstelle einer normalen Http-Seite,
Code-Beispiele habe ich aber nicht und das ist auch kein Thema für ein paar Minuten, eher Stunden und Tage,

hier gibts nur die Idee/ den Hinweis,
Lernen muss man mit Tutorials 

(oder jemand anders kann es genau aufführen)


----------



## rolf (12. Jul 2007)

Habe jetzt mit Meta-Tag in der Bestätigungsseite folgendes eingetragen:


```
<meta http-equiv="refresh" content="url=show_data.jsp">
```

Leider, ist das Problem weiterhin vorhanden.


----------



## rolf (12. Jul 2007)

SlaterB hat gesagt.:
			
		

> das Servlet schickt den Redirct anstelle einer normalen Http-Seite,
> Code-Beispiele habe ich aber nicht und das ist auch kein Thema für ein paar Minuten, eher Stunden und Tage,
> 
> hier gibts nur die Idee/ den Hinweis,
> ...



Vielen Dank.


----------



## HLX (12. Jul 2007)

Der Aktualisieren-Button löst ein GET aus. Warum verwendest du zum Versenden nicht die HTTP-Methode POST?


----------



## rolf (12. Jul 2007)

HLX hat gesagt.:
			
		

> Der Aktualisieren-Button löst ein GET aus. Warum verwendest du zum Versenden nicht die HTTP-Methode POST?



Habe schon probiert. Aber, auch mit POST ist nicht anders. Einzig sind die Params nicht im URL sichtbar. 

Oder, meinst du, dass ich die Implementierung der doGet-Methode des Servlets weg lasse? Falls ja, werde ich vermutlich mit der Meldung (... steht nicht zur Verfügung ... ) konfrontiert. Oder, meinst du was anderes?


----------



## HLX (12. Jul 2007)

Genau, du brauchst doGet() nicht mehr zu implementieren, es sei denn zu möchtest das dort etwas bestimmtes passiert.


----------



## rolf (12. Jul 2007)

Ich habe es vorläufig wie folgt gelöst: 


```
private String getUrl(String zielSeite, Bean b)
	{
	
			String params = ... (Zielseite + ? + alle andere Bean-Properties) 
	

			// URL zusammensetzen
			String url = zielSeite + "?" + params;

			return url;
	}
	
	// Redirect senden
	response.sendRedirect(url);
```

Das funktioniert. Daten werden nicht mehr erneut in die DB geschrieben. Allerdings, obwohl ich überall mit POST arbeite, werden die an die REDIRECT übergebene Params (QUERY_STRING) im URL angezeigt. 

Ich kann damit leben, wäre aber noch schöner, wenn diese nicht sichtbar wären. 

Kann ich irgendwo im Servlet die Methode auf POST setzen (Headers oder was ähnlich). 

Falls jemand einen besseren Vorschlag hätte, wäre ich froh, wenn man mich belehren würde.


----------



## Guest (12. Jul 2007)

HLX hat gesagt.:
			
		

> Genau, du brauchst doGet() nicht mehr zu implementieren, es sei denn zu möchtest das dort etwas bestimmtes passiert.



Nun, prinzipiell implementieren ich immer beide Methoden, aber es spricht eigentlich nichts dagegen. 

Danke.


----------



## Guest (12. Jul 2007)

rolf hat gesagt.:
			
		

> Ich habe es vorläufig wie folgt gelöst:
> 
> 
> ```
> ...



Ah, noch eine Kleinlichkeit, die ich vergessen habe: Headers werden vor dem Redirect-Aufruf gesetzt: 


```
// Vor dem Redirect Headers setzen
response.setHeader("Location", url);
// Status setzen (301 --> redirect)
response.setStatus(301);
```


----------



## rolf (12. Jul 2007)

HLX hat gesagt.:
			
		

> Genau, du brauchst doGet() nicht mehr zu implementieren, es sei denn zu möchtest das dort etwas bestimmtes passiert.



Habe es jetzt zum Testen tatsächlich gemacht: Methode doGet weg (völlig auskommentiert), alle Formulare mit POST versehen. Wenn ich aber auf Refresh-Icon klicke, wird irgendwie die doPost-Methode doch gefunden! Ist das wirklich so, dass Refresh die doGet aufruft? Oder, ist da noch was, was ich nicht beachtet habe?


----------



## HLX (12. Jul 2007)

rolf hat gesagt.:
			
		

> HLX hat gesagt.:
> 
> 
> 
> ...



Beim Refresh wird die Seite neu angefordert (GET). Post wird durch eine Submit-Funktion auf ein Formular ausgelöst. Mir ist nicht bekannt, dass das durch ein Refresh möglich ist. Das es nicht funktioniert kann vielfältige Ursachen haben. Kannst du´s debuggen?


----------



## Guest (12. Jul 2007)

HLX hat gesagt.:
			
		

> Beim Refresh wird die Seite neu angefordert (GET). Post wird durch eine Submit-Funktion auf ein Formular ausgelöst. Mir ist nicht bekannt, dass das durch ein Refresh möglich ist. Das es nicht funktioniert kann vielfältige Ursachen haben. Kannst du´s debuggen?



Nein, kann ich nicht. Aber, ich habe es jetzt noch extra getestet. Dabei habe ich im Servlet _Demo _die Methode *doGet* auskommentiert. Zum Testen wurde auch die _test.html_ Seite mit einem Formular erstellt. 

Die Methode _doPost _sieht wie folgt aus: 


```
protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException
    {
        String mt = request.getMethod();

        PrintWriter out = response.getWriter();

        out.println("POST: Methode: " + mt);
    }
```


_test.html_ mit *GET *--> geht nicht (wie erwartet) - Msg: _HTTP method GET is not supported by this URL_

_test.html_ mit *POST *--> funktioniert (wie erwartet)

Nun, wenn ich von _test.html_ zum Servlet _Demo_ angekommen bin, und dann auf "Refresh" klicke, kommt nur eine Warnung (doppelte Ausführung), und wenn ich auf OK klicke, geht die Ausführung weiter. Die Ausgabe wird wiederholt: 


```
POST: Methode: POST
```

Falls ich mich nicht täusche, ein klarer Fall: _Refresh _wird irgendwie zur Methode *doPost * umgeleitet. Aber wie, und nach welchen Spielregeln? Falls jemand den Durchblick hat, wäre super, davon zu erfahren.


----------



## HLX (13. Jul 2007)

Ich hab´s mal ausprobiert und du hast recht: Er verwendet die zuletzt benutzte HTTP-Methode bei der Aktualisierung. War mit nicht bewusst da ich mit 'Struts' dieses Problem bislang nicht hatte und die Verwendung reiner Servlets liegen bei mir schon Jahre zurück. Bin einfach davon ausgegangen, dass die Seite einfach neu angefordert wird.  

Das sinnvollste in diesem Falle wurde dann schon genannt: ein Redirect auf die Ausgabeseite. Die kannst du dann aktualisieren so oft du willst.


----------



## WeirdAl (13. Jul 2007)

Hi,
für solche Probleme gibts sogar auch ein Pattern  :wink:. Ich hatte auch vor kurzen erst das Problem mit meinen Formularen, da ich nicht selbst darauf gekommen bin mit dem Zurück und Refresh Button des Browsers zu spielen

Cu
Alex


----------



## rolf (15. Jul 2007)

WeirdAl hat gesagt.:
			
		

> Hi,
> für solche Probleme gibts sogar auch ein Pattern  :wink:.
> 
> Cu
> Alex



Danke Alex.


----------

