Servlet Redirect vs Forward

Servlet Redirect vs Forward

1. Vue d'ensemble

De temps en temps, le gestionnaire de requêtes HTTP initial de notre servlet Java doit déléguer la requête à une autre ressource. Dans ces cas, nous pouvons soit transférer la demande, soit la rediriger vers une ressource différente.

Nous utiliserons les deux mécanismes et discuterons des différences et des meilleures pratiques de chacun.

2. Dépendances Maven

Tout d'abord, ajoutons la dépendance Servlet Maven:


    javax.servlet
    javax.servlet-api
    4.0.0

La dernière version peut être trouvéehere.

3. Vers l'avant

Passons maintenant à l'action et voyons comment faire une avance simple:

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

Nous récupérons la référence deRequestDispatcher du servlet parent et la pointons vers une autre ressource serveur.

En termes simples, cela transmettra la demande.

Lorsqu'un client soumet une demande àhttp://localhost:8081/hello?name=Dennis, cette logique s'exécutera et la demande sera transmise à «/forwarded».

4. Réorienter

Maintenant que nous comprenons le concept de transfert, jetons un coup d'œil à un extrait de code pour la redirection:

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

Lorsqu'un client soumet une demande àhttp://localhost:8081/welcome?name=Dennis, la demande sera redirigée vershttp://localhost:8081/redirected.

Pour en savoir plus sur les redirections dans le contexte de Spring, jetez un œil à nosarticle here dédiés.

5. Différences

Nous avons passé le paramètre «name» avec une valeur dans les deux cas. Simply put, forwarded requests still carry this value, but redirected requests don’t.

En effet, avec une redirection, l'objet de requête est différent de celui d'origine. Si nous voulons toujours utiliser ce paramètre, nous devons le sauvegarder dans l'objetHttpSession.

Voici une liste des principales différences entre les redirections et les servlets:

Forward:

  • La demande sera traitée ultérieurement côté serveur

  • Le client n'est pas affecté par le transfert, l'URL dans un navigateur reste la même

  • Les objets demande et réponse resteront le même objet après le transfert. Les objets demande-portée seront toujours disponibles

Redirect:

  • La demande est redirigée vers une autre ressource

  • Le client verra l'URL changer après la redirection

  • Une nouvelle demande est créée

  • La redirection est normalement utilisée dans le modèle de développement Web dePost/Redirect/Get

6. Conclusion

Le transfert et la redirection sont tous deux liés à l'envoi d'un utilisateur à des ressources différentes, bien qu'ils aient une sémantique assez différente.

Choisir entre ceux-ci est simple. Si la portée précédente est requise, ou si l'utilisateur n'a pas besoin d'être informé, mais l'application souhaite également effectuer une action internethen use forwarding.

Pour ignorer la portée ou si le nouveau contenu n'est pas associé à la demande d'origine - comme une redirection vers une page de connexion ou la soumission d'un formulaire -then use redirecting.

Comme toujours, l'exemple de code peut être trouvéover on GitHub.