URL - Params entfernen

Status
Nicht offen für weitere Antworten.
R

rolf

Gast
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.
 
S

SlaterB

Gast
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
 
R

rolf

Gast
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,
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

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.
 
S

SlaterB

Gast
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)
 
R

rolf

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

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

Leider, ist das Problem weiterhin vorhanden.
 
R

rolf

Gast
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,
Lernen muss man mit Tutorials ;)

(oder jemand anders kann es genau aufführen)

Vielen Dank.
 

HLX

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

rolf

Gast
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

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

rolf

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

Code:
   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.
 
G

Guest

Gast
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.
 
G

Guest

Gast
rolf hat gesagt.:
Ich habe es vorläufig wie folgt gelöst:

Code:
   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.

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

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

rolf

Gast
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

Top Contributor
rolf hat gesagt.:
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?

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?
 
G

Guest

Gast
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:

Code:
   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:

Code:
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

Top Contributor
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. :oops:

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

WeirdAl

Bekanntes Mitglied
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Wie auf request.params mittels ${} zugreifen? Allgemeines EE 7

Ähnliche Java Themen

Neue Themen


Oben