RequestDispatcher.forward () vs HttpServletResponse.sendRedirect ()

124

Was ist der konzeptionelle Unterschied zwischen forward()und sendRedirect()?

RKCY
quelle

Antworten:

106

requestDispatcher - forward () -Methode

  1. Wenn wir die forwardMethode verwenden, wird die Anforderung zur weiteren Verarbeitung an eine andere Ressource auf demselben Server übertragen.

  2. Im Fall von forwardübernimmt der Webcontainer die gesamte Verarbeitung intern und der Client oder Browser ist nicht beteiligt.

  3. Wenn forwarddas requestDispatcherObjekt aufgerufen wird, übergeben wir die Anforderungs- und Antwortobjekte, sodass unser altes Anforderungsobjekt in der neuen Ressource vorhanden ist, die unsere Anforderung verarbeiten wird.

  4. Visuell können wir die weitergeleitete Adresse nicht sehen, sie ist transparent.

  5. Die Verwendung der forward()Methode ist schneller als sendRedirect.

  6. Wenn wir mit Forward umleiten und dieselben Daten in einer neuen Ressource verwenden möchten, können wir verwenden, request.setAttribute()da ein Anforderungsobjekt verfügbar ist.

SendRedirect

  1. In diesem Fall sendRedirectwird die Anforderung zur weiteren Verarbeitung an eine andere Ressource, an eine andere Domäne oder an einen anderen Server übertragen.

  2. Bei Verwendung sendRedirectüberträgt der Container die Anforderung an den Client oder Browser, sodass die in der sendRedirectMethode angegebene URL als neue Anforderung für den Client angezeigt wird .

  3. Bei einem sendRedirectAnruf gehen die alten Anforderungs- und Antwortobjekte verloren, da sie vom Browser als neue Anforderung behandelt werden.

  4. In der Adressleiste sehen wir die neue umgeleitete Adresse. Es ist nicht transparent.

  5. sendRedirectist langsamer, weil ein zusätzlicher Roundtrip erforderlich ist, weil eine völlig neue Anforderung erstellt wird und das alte Anforderungsobjekt verloren geht. Es sind zwei Browseranfragen erforderlich.

  6. Aber sendRedirect, wenn wir die gleichen Daten für eine neue Ressource verwenden wollen , müssen wir die Daten in der Sitzung speichern oder mit der URL übergeben zusammen.

Welches ist gut?

Dies hängt vom Szenario ab, für das die Methode nützlicher ist.

Wenn Sie möchten, dass die Steuerung auf einen neuen Server oder Kontext übertragen wird und als völlig neue Aufgabe behandelt wird, dann entscheiden wir uns für sendRedirect. Im Allgemeinen sollte eine Weiterleitung verwendet werden, wenn der Vorgang beim erneuten Laden der Webseite durch den Browser sicher wiederholt werden kann und das Ergebnis nicht beeinflusst.

Quelle

Abhijeet Ashok Muneshwar
quelle
160

In der Welt der Webentwicklung bedeutet der Begriff "Weiterleitung", dass dem Client eine leere HTTP-Antwort mit nur einem LocationHeader gesendet wird, der die neue URL enthält, an die der Client eine brandneue GET-Anforderung senden muss. Also im Grunde genommen:

  • Der Client sendet eine HTTP-Anfrage an some.jsp.
  • Der Server sendet eine HTTP-Antwort mit Location: other.jspHeader zurück
  • Der Client sendet eine HTTP-Anfrage an other.jsp(dies wird in der Adressleiste des Browsers angezeigt!)
  • Der Server sendet eine HTTP-Antwort mit dem Inhalt von zurück other.jsp.

Sie können es mit dem integrierten / Addon-Entwickler-Toolset des Webbrowsers verfolgen. Drücken Sie in Chrome / IE9 / Firebug F12 und überprüfen Sie den Abschnitt "Netzwerk", um ihn anzuzeigen.

Genau das oben Genannte wird erreicht durch sendRedirect("other.jsp"). Der RequestDispatcher#forward()sendet keine Weiterleitung. Stattdessen wird der Inhalt der Zielseite als HTTP-Antwort verwendet.

  • Der Client sendet eine HTTP-Anfrage an some.jsp.
  • Der Server sendet eine HTTP-Antwort mit dem Inhalt von zurück other.jsp.

Wie bei der ursprünglichen HTTP-Anforderung some.jspbleibt die URL in der Adressleiste des Browsers jedoch unverändert. Außerdem sind alle im Controller dahinter festgelegten Anforderungsattribute in some.jspverfügbar other.jsp. Dies geschieht nicht während einer Umleitung, da Sie den Client grundsätzlich dazu zwingen, eine neue HTTP-Anforderung zu erstellen, wodurch other.jspdie ursprüngliche Anforderung some.jspverworfen wird, wenn alle seine Attribute eingeschlossen werden.


Dies RequestDispatcherist äußerst nützlich im MVC-Paradigma und / oder wenn Sie JSPs vor dem direkten Zugriff verbergen möchten. Sie können JSPs in den /WEB-INFOrdner legen und eine verwenden, Servletdie die Anforderungen steuert, vorverarbeitet und nachbearbeitet. Auf die JSPs im /WEB-INFOrdner kann nicht direkt über die URL zugegriffen werden, sie können jedoch über die URL Servletauf sie zugreifen RequestDispatcher#forward().

Sie können beispielsweise eine JSP-Datei in haben /WEB-INF/login.jspund eine, LoginServletdie einer url-patternvon zugeordnet ist /login. Wenn Sie aufrufen http://example.com/context/login, werden die Servlets doGet()aufgerufen. Sie können eine beliebige tun pre dort Verarbeitung Sachen und schließlich nach vorn die Anfrage wie:

request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);

Wenn Sie ein Formular senden, möchten Sie normalerweise Folgendes verwenden POST:

<form action="login" method="post">

Auf diese Weise der Servlets doPost()wird aufgerufen und Sie können jede tun Post dort (zB Validierung, Geschäftslogik, anmelden , um den Benutzer, usw.) Verarbeitung Zeug.

Wenn es irgendwelche Fehler gibt, dann wollen Sie in der Regel zu übermitteln die Anforderung wieder auf die gleiche Seite und die Fehler dort neben den Eingabefeldern angezeigt werden und so weiter. Sie können das RequestDispatcherdafür verwenden.

Wenn a POSTerfolgreich ist, möchten Sie die Anforderung normalerweise umleiten , damit die Anforderung nicht erneut gesendet wird, wenn der Benutzer die Anforderung aktualisiert (z. B. Drücken von F5 oder Zurücknavigieren im Verlauf).

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
    request.setAttribute("error", "Unknown login, please try again."); // Set error.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}

Eine Umleitung weist den Client daher an, eine neue GETAnforderung unter der angegebenen URL auszulösen. Durch das Aktualisieren der Anforderung wird dann nur die umgeleitete Anforderung und nicht die ursprüngliche Anforderung aktualisiert. Dies vermeidet "doppelte Einreichungen" und Verwirrung sowie schlechte Benutzererfahrungen. Dies wird auch als POST-Redirect-GETMuster bezeichnet .

Siehe auch:

BalusC
quelle
Beim Umleiten von einem Servlet zu einer JSP-Seite wird die JSP-Seite teilweise geladen, wie in stackoverflow.com/questions/12337624/… . Ich wollte, dass das erste, was ausgeführt wird, wenn jemand auf foo.com klickt , das Servlet ist. Vom Servlet aus gehe ich response.sendRedirect("..")auf die index.jsp-Seite der Website. Dadurch werden jedoch die CSS-Dateien und Text von der JSP-Seite übersehen, was zu einem teilweisen Laden der Seite führt. Aber wenn ich die Begrüßungsseite der Website zu index.jsp mache, funktioniert alles einwandfrei und das Laden der Seite ist abgeschlossen. Was ist los mit der Weiterleitung?
SaplingPro
19

Über die RequestDispatcherSchnittstelle können Sie eine serverseitige Weiterleitung / Einbeziehung durchführen, während sendRedirect()eine clientseitige Umleitung erfolgt. Bei einer clientseitigen Umleitung sendet der Server den HTTP-Statuscode 302(temporäre Umleitung) zurück, wodurch der Webbrowser eine brandneue HTTP- GETAnforderung für den Inhalt am umgeleiteten Speicherort ausgibt. Im Gegensatz dazu wird bei Verwendung der RequestDispatcherSchnittstelle das Einschließen / Weiterleiten an die neue Ressource vollständig auf der Serverseite behandelt.

Asaph
quelle
Und letzteres ist eigentlich forwardkeine Weiterleitung.
Adeel Ansari
4

Jede dieser Methoden ist möglicherweise "besser", dh besser geeignet, je nachdem, was Sie tun möchten.

Eine serverseitige Umleitung ist insofern schneller, als Sie die Daten von einer anderen Seite abrufen, ohne einen Roundtrip zum Browser durchzuführen. Die im Browser angezeigte URL ist jedoch immer noch die ursprüngliche Adresse, sodass Sie dort eine kleine Inkonsistenz erzeugen.

Eine clientseitige Umleitung ist insofern vielseitiger, als sie Sie an einen völlig anderen Server senden oder das Protokoll (z. B. von HTTP zu HTTPS) oder beides ändern kann. Und der Browser kennt die neue URL. Es ist jedoch ein zusätzliches Hin und Her zwischen Server und Client erforderlich.

Carl Smotricz
quelle
2
Dieses Segment hier wird im Web nicht genug erwähnt: "oder ändern Sie das Protokoll (z. B. von HTTP zu HTTPS) oder beides"
Perdomoff
4

Der Hauptunterschied zwischen der forward () - und der sendRedirect () -Methode besteht darin, dass im Fall von forward () die Umleitung am Serverende erfolgt und für den Client nicht sichtbar ist. Im Fall von sendRedirect () erfolgt die Umleitung am Clientende und ist sichtbar an den Kunden.

Geben Sie hier die Bildbeschreibung ein

Joby Wilson Mathews
quelle
2
Ein Bild sagt mehr als tausend Worte :)
Eugen Labun
3

SendRedirect()durchsucht den Inhalt zwischen den Servern. Es ist langsam, weil es den Browser durch Senden der URL des Inhalts intimieren muss. Der Browser erstellt dann eine neue Anforderung für den Inhalt auf demselben oder einem anderen Server.

RquestDispatcherist für die Suche nach Inhalten auf dem Server, denke ich. Es ist der serverseitige Prozess und im Vergleich zur SendRedirect()Methode schneller . Die Sache ist jedoch, dass der Browser, auf dem der Server das erforderliche Datum oder den gewünschten Inhalt durchsucht, nicht informiert wird und der Browser auch nicht aufgefordert wird, die URL auf der Registerkarte URL zu ändern. Dies verursacht dem Benutzer nur geringe Unannehmlichkeiten.

Rajagonda
quelle
1

Die technische Umleitung sollte entweder verwendet werden, wenn die Kontrolle auf eine andere Domäne übertragen werden muss oder um eine Aufgabentrennung zu erreichen.

Zum Beispiel führen wir in der Zahlungsanwendung zuerst den PaymentProcess aus und leiten dann zu displayPaymentInfo um. Wenn der Client den Browser aktualisiert, wird nur die displayPaymentInfo erneut ausgeführt und PaymentProcess wird nicht wiederholt. Wenn wir in diesem Szenario jedoch Forward verwenden, werden sowohl PaymentProcess als auch displayPaymentInfo nacheinander erneut ausgeführt, was zu inkonsistenten Daten führen kann.

In anderen Szenarien ist die Weiterleitung effizient, da sie schneller als sendRedirect ist

Rohit Goyal
quelle
0

Request Dispatcher ist eine Schnittstelle, über die die Anforderung oder Antwort von der Webressource an eine andere Webressource gesendet wird. Es enthält hauptsächlich zwei Methoden.

  1. request.forward(req,res): Diese Methode wird verwendet, um die Anforderung von einer Webressource an eine andere Ressource weiterzuleiten. dh von einem Servlet zu einem anderen Servlet oder von einer Webanwendung zu einer anderen Webanwendung.

  2. response.include(req,res): Diese Methode umfasst die Antwort eines Servlets auf ein anderes Servlet

HINWEIS: Mit dem Request Dispatcher können wir die Anfrage oder die Antworten auf demselben Server weiterleiten oder einschließen.

request.sendRedirect(): Auf diese Weise können wir die Anfrage oder Antworten auf den verschiedenen Servern weiterleiten oder einschließen. In diesem Fall erhält der Client eine Umleitung, während er die Seite umleitet. Im obigen Prozess erhält der Client jedoch keine Andeutung

Ashwin Patil
quelle
-1

Einfach Unterschied zwischen Forward(ServletRequest request, ServletResponse response)und sendRedirect(String url)ist

nach vorne():

  1. Die forward()Methode wird serverseitig ausgeführt.
  2. Die Anforderung wird an eine andere Ressource innerhalb desselben Servers übertragen.
  3. Dies hängt nicht vom Anforderungsprotokoll des Clients ab, da die forward ()Methode vom Servlet-Container bereitgestellt wird.
  4. Die Anforderung wird von der Zielressource gemeinsam genutzt.
  5. Bei dieser Methode wird nur ein Anruf verbraucht.
  6. Es kann innerhalb des Servers verwendet werden.
  7. Wir können die weitergeleitete Nachricht nicht sehen, sie ist transparent.
  8. Die forward()Methode ist schneller als die sendRedirect()Methode.
  9. Es wird in der RequestDispatcherSchnittstelle deklariert .

sendRedirect ():

  1. Die sendRedirect () -Methode wird auf der Clientseite ausgeführt.
  2. Die Anforderung wird an eine andere Ressource auf einen anderen Server übertragen.
  3. Die sendRedirect () -Methode wird unter HTTP bereitgestellt und kann daher nur mit HTTP-Clients verwendet werden.
  4. Für die Zielressource wird eine neue Anforderung erstellt.
  5. Es werden zwei Anforderungs- und Antwortanrufe verbraucht.
  6. Es kann innerhalb und außerhalb des Servers verwendet werden.
  7. Wir können umgeleitete Adresse sehen, es ist nicht transparent.
  8. Die sendRedirect () -Methode ist langsamer, da beim Erstellen einer neuen Anforderung das alte Anforderungsobjekt verloren geht.
  9. Es wird in HttpServletResponse deklariert.
Maulik Kakadiya
quelle