2010-12-10 6 views
3

Ich habe ein Szenario, in dem der Benutzer auf einen "Restaurant" -Link klickt (für die Suche nach Restaurants in einer bestimmten Ortschaft). Ich muss überprüfen, ob der Standort festgelegt ist oder nicht. Wenn es nicht festgelegt ist, möchte ich ihn auf eine Seite umleiten, auf der er den Standort festlegen kann, und dann zu den Suchergebnissen zurückkehren, die nach dem festgelegten Standort gefiltert wurden. Ich verwende response.sendRedirect(url), um den Benutzer auf die Einstellungsort-Seite umzuleiten. Aber wie kann ich die Umleitungs-URL senden (d. H. Die URL, an die ich den Benutzer senden möchte, nachdem der Standort festgelegt wurde)?Umleiten von Benutzern mit HTTP-Antwort

Ich versuchte dies:

response.sendRedirect("/location/set.html?action=asklocation&redirectUrl="+ 
      request.getRequestUri()+request.getQueryString()); 

aber dies nicht funktioniert und 404 Fehler angezeigt; Außerdem sieht die URL im Browser nicht gut aus.

Bitte, wenn jemand das Problem lösen könnte ...

+0

Error 404 FileNotFound, müssen Sie diese http sicherzustellen: // /location/set.html existiert. Was passiert, wenn Sie die erwähnte URL auslösen? – Koekiebox

+0

versuchen Sie, ohne die erste/ – mauretto

Antwort

7

Sieht aus wie Sie mindestens ein fehlendes „?“ zwischen request.getRequestUri() und request.getQueryString(). Sie sollten auch den Parameter url-encodieren, den Sie für java.net.URLEncoder verwenden können.

Wenn Sie Redirects ausführen, müssen Sie auch den Kontextpfad voranstellen: request.getContextPath().

So etwas wie

String secondRedirectUrl = request.getRequestUri()+"?"+request.getQueryString(); 
String encodedSecondRedirectUrl = URLEncoder.encode(secondRedirectUrl, serverUrlEncodingPreferablyUTF8); 
String firstRedirectUrl = request.getContextPath()+"/location/set.html?action=asklocation&redirectUrl="+encodedSecondRedirectUrl; 
response.sendRedirect(firstRedirectUrl); 

Persönlich würde ich eher das Problem lösen, indem ein RequestDispatcher in der Sitzung zu speichern und zu dem Weiterleiten nach dem Standort eingestellt wurde.

+0

Warum benötigt er die zusätzliche '?', Das OP enthalten es in seiner relativen URL –

+0

Der Wert des 'redirectUrl' Parameter ist ein Pfad mit Abfragezeichenfolge, die das OP nach dem Einstellen umleiten möchte Ort auf '/ location/set.html'. Er muss den Pfad von der Abfragezeichenfolge trennen. Andernfalls, wenn die aktuelle Seite '/ foo/bar? Problem = lol' ist, endet er bei'/foo/barbroblem = lol', was 404 ergibt. –

+0

Die URL 'location/set.html? Action = asklocation & redirectUrl =' enthält bereits ein '?', sollst du '&' sagen? –

1

Meine erste Reaktion wird sein, die / auf Ihrer URL zu entfernen, etwas von diesem Effekt (zum Code):

response.sendRedirect("location/set.html?action=asklocation&redirectUrl="+ 
      request.getRequestUri()+request.getQueryString()); 

Wenn das nicht funktioniert, fügt request.getContextPath() am Anfang des URL-String , etwa so:

response.sendRedirect(request.getContextPath() + "/location/set.html?action=asklocation&redirectUrl="+request.getRequestUri()+request.getQueryString()); 

Die Javadoc Zustände:

Wenn die Position ist relativ ohne führenden '/' der Container interpretiert es als relativ zu der aktuellen Anforderung URI. Wenn die Position relativ zu ein führendes '/' ist, interpretiert der Container als relativ zum Servlet Containerstamm.

+0

Der op sagt nie, dass der Pfad relativ zum aktuellen Anfrage-URI ist? –

+0

@Christoffer Hammarström, nein..aber da er einen 404 erhält, kann der Servlet-Container die vollständige URL nicht zuordnen. –

+0

Ich habe es so verstanden, dass der 404 beim Versuch war, auf den im Parameter angegebenen Pfad umzuleiten. Das 404 könnte auch daran liegen, dass ihm der Kontextpfad fehlt. –

Verwandte Themen