Servlet-Weiterleitung vs. Weiterleitung

Servlet-Umleitung vs Weiterleiten

1. Überblick

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 Anfrage 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 unterhere.

3. Nach vorne

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 Referenz vonRequestDispatchervom übergeordneten Servlet und verweisen sie auf eine andere Serverressource.

Einfach ausgedrückt, wird dies die Anfrage weiterleiten.

Wenn ein Client eine Anforderung anhttp://localhost:8081/hello?name=Dennis sendet, wird diese Logik ausgeführt und die Anforderung an „/forwarded“ weitergeleitet.

4. Umleiten

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");
}

We use original response object to redirect this request to another URL: “/redirected”.

Wenn ein Client eine Anforderung anhttp://localhost:8081/welcome?name=Dennis sendet, wird die Anforderung anhttp://localhost:8081/redirected. umgeleitet

Um mehr über das Durchführen von Weiterleitungen im Kontext des Frühlings zu erfahren, werfen Sie einen Blick auf unsere dediziertenarticle here.

5. Unterschiede

In beiden Fällen haben wir den Parameter „name“ mit einem Wert übergeben. Simply put, forwarded requests still carry this value, but redirected requests don’t.

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

Hier ist eine Liste der Hauptunterschiede zwischen Servlet-Weiterleitung und -Umleitung:

Forward:

  • Die Anfrage wird serverseitig weiterverarbeitet

  • Der Client ist von der Weiterleitung nicht betroffen. Die URL in einem Browser bleibt unverändert

  • Anforderungs- und Antwortobjekte bleiben nach der Weiterleitung dasselbe Objekt. Request-Scope-Objekte sind weiterhin verfügbar

Redirect:

  • Die Anforderung wird an eine andere Ressource umgeleitet

  • Der Client sieht die URL-Änderung nach der Umleitung

  • Eine neue Anfrage wird erstellt

  • Die Umleitung wird normalerweise innerhalb des Webentwicklungsmusters vonPost/Redirect/Getverwendet

6. Fazit

Beim Weiterleiten und Umleiten wird ein Benutzer an verschiedene Ressourcen gesendet, obwohl die Semantik sehr unterschiedlich ist.

Das Auswählen zwischen diesen ist einfach. Wenn der vorherige Bereich erforderlich ist oder der Benutzer nicht informiert werden muss, die Anwendung jedoch auch eine interne Aktionthen use forwarding ausführen möchte.

So verwerfen Sie den Bereich 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 eines Formulars -then use redirecting.

Der Beispielcode befindet sich wie immer inover on GitHub.