Servlet Redirect vs Forward

1. Übersicht

Gelegentlich muss der anfängliche HTTP-Anforderungshandler in unserem Java-Servlet die Anforderung an eine andere Ressource delegieren. In diesen Fällen können wir die Anforderung entweder weiterleiten oder an eine andere Ressource umleiten.

Wir werden beide Mechanismen verwenden und die Unterschiede und Best Practices der einzelnen Mechanismen diskutieren.

2. Maven-Abhängigkeiten

Fügen wir zunächst die Servlet Maven-Abhängigkeit hinzu:

 javax.servlet javax.servlet-api 4.0.0 

Die neueste Version finden Sie hier.

3. Weiterleiten

Lassen Sie uns jetzt gleich loslegen und einen Blick darauf werfen, wie man einen einfachen Vorlauf macht:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher dispatcher = getServletContext() .getRequestDispatcher("/forwarded"); dispatcher.forward(req, resp); }

Wir erhalten die RequestDispatcher- Referenz vom übergeordneten Servlet und verweisen sie auf eine andere Serverressource.

Einfach ausgedrückt, wird die Anfrage weitergeleitet.

Wenn ein Client eine Anfrage an // localhost: 8081 / hello? Name = Dennis sendet , wird diese Logik ausgeführt und die Anfrage an " / forwarded " weitergeleitet .

4. Weiterleiten

Nachdem wir das Konzept der Weiterleitung verstanden haben, werfen wir einen Blick auf einen kurzen Ausschnitt zur Umleitung:

protected void doGet(HttpServletRequest req, HttpServletResponse resp){ resp.sendRedirect(req.getContextPath() + "/redirected"); } 

Wir verwenden das ursprüngliche Antwortobjekt, um diese Anfrage an eine andere URL umzuleiten : " / redirected".

Wenn ein Client eine Anfrage an // localhost: 8081 / welcome? Name = Dennis sendet , wird die Anfrage an // localhost: 8081 / redirected umgeleitet.

Um mehr über Weiterleitungen im Kontext des Frühlings zu erfahren, lesen Sie unseren speziellen Artikel hier.

5. Unterschiede

In beiden Fällen haben wir den Parameter „ Name “ mit einem Wert übergeben. Einfach ausgedrückt, weitergeleitete Anforderungen haben immer noch diesen Wert, umgeleitete Anforderungen jedoch nicht.

Dies liegt daran, dass sich das Anforderungsobjekt bei einer Umleitung vom ursprünglichen unterscheidet. Wenn wir diesen Parameter weiterhin verwenden möchten, müssen wir ihn im HttpSession- Objekt speichern .

Hier ist eine Liste der Hauptunterschiede zwischen Servlet Forward und Redirect:

Vorwärts :

  • Die Anfrage wird serverseitig weiterverarbeitet
  • Der Client ist nicht von der Weiterleitung betroffen, die URL in einem Browser bleibt gleich
  • Anforderungs- und Antwortobjekte bleiben nach der Weiterleitung dasselbe Objekt. Request-Scope-Objekte sind weiterhin verfügbar

Weiterleiten :

  • Die Anforderung wird an eine andere Ressource umgeleitet
  • Der Client sieht, dass sich die URL nach der Umleitung ändert
  • Eine neue Anfrage wird erstellt
  • Redirect wird normalerweise im Webentwicklungsmuster Post / Redirect / Get verwendet

6. Fazit

Beim Weiterleiten und Umleiten geht es darum, einen Benutzer an verschiedene Ressourcen zu senden, obwohl sie eine ganz andere Semantik haben.

Die Auswahl zwischen diesen ist einfach. Wenn der vorherige Bereich erforderlich ist oder der Benutzer nicht informiert werden muss, die Anwendung jedoch auch eine interne Aktion ausführen möchte, verwenden Sie die Weiterleitung .

Verwenden Sie die Umleitung, um den Bereich zu verwerfen oder wenn der neue Inhalt nicht mit der ursprünglichen Anforderung verknüpft ist, z. B. eine Weiterleitung zu einer Anmeldeseite oder das Ausfüllen einer Formularübermittlung .

Der Beispielcode ist wie immer auf GitHub zu finden.