Servlet-omleiding versus doorsturen

1. Overzicht

Af en toe moet de initiële HTTP-aanvraaghandler in onze Java-servlet de aanvraag naar een andere bron delegeren. In deze gevallen kunnen we het verzoek verder doorsturen of doorverwijzen naar een andere bron.

We gebruiken beide mechanismen en bespreken de verschillen en best practices van elk.

2. Maven afhankelijkheden

Laten we eerst de Servlet Maven-afhankelijkheid toevoegen:

 javax.servlet javax.servlet-api 4.0.0 

De laatste versie vind je hier.

3. Vooruit

Laten we nu meteen naar binnen springen en kijken hoe u een eenvoudige stap vooruit kunt doen:

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

We krijgen te pakken RequestDispatcher verwijzing van bovenliggende Servlet en verwijs deze naar een andere serverbron.

Simpel gezegd, hierdoor wordt het verzoek doorgestuurd.

Wanneer een klant een verzoek indient bij // localhost: 8081 / hallo? name = Dennis, deze logica wordt uitgevoerd en het verzoek wordt doorgestuurd naar "/ doorgestuurd“.

4. Omleiden

Nu we het concept van doorsturen begrijpen, laten we eens kijken naar een snel fragment voor omleiden:

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

We gebruiken het originele responsobject om dit verzoek om te leiden naar een andere URL: “/ omgeleid ”.

Wanneer een klant een verzoek indient bij // localhost: 8081 / welkom? naam = Dennis, wordt het verzoek doorgestuurd naar // localhost: 8081 / omgeleid.

Lees hier ons speciale artikel voor meer informatie over het uitvoeren van omleidingen in de context van Spring.

5. Verschillen

We hebben de parameter ‘naam”Met een waarde in beide gevallen. Simpel gezegd, doorgestuurde verzoeken hebben nog steeds deze waarde, maar omgeleide verzoeken niet.

Dit komt doordat bij een omleiding het request-object verschilt van het originele. Als we deze parameter toch willen gebruiken, moeten we deze opslaan in de HttpSession voorwerp.

Hier is een lijst met de belangrijkste verschillen tussen servlet forward en redirect:

Vooruit:

  • Het verzoek wordt aan de serverzijde verder verwerkt
  • De client wordt niet beïnvloed door forward, URL in een browser blijft hetzelfde
  • Verzoek- en antwoordobjecten blijven na doorsturen hetzelfde object. Request-scope-objecten zullen nog steeds beschikbaar zijn

Omleiden:

  • Het verzoek wordt omgeleid naar een andere bron
  • De klant zal de URL zien veranderen na de omleiding
  • Er wordt een nieuw verzoek aangemaakt
  • Omleiding wordt normaal gebruikt binnen het Post / Redirect / Get webontwikkelingspatroon

6. Conclusie

Doorsturen en omleiden hebben beide betrekking op het sturen van een gebruiker naar verschillende bronnen, hoewel ze een behoorlijk verschillende semantiek hebben.

Kiezen tussen deze is eenvoudig. Als de vorige scope vereist is, of de gebruiker hoeft niet te worden geïnformeerd, maar de applicatie wil ook een interne actie uitvoeren gebruik dan doorsturen.

Om het bereik te negeren of als de nieuwe inhoud niet aan het oorspronkelijke verzoek is gekoppeld - zoals een omleiding naar een inlogpagina of het invullen van een formulierinzending - gebruik dan omleiding.

Zoals altijd is de voorbeeldcode te vinden op GitHub.