Redirection vers l'avant de servlet

1. Vue d'ensemble

Parfois, 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 plus loin, soit la rediriger vers une autre ressource.

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

2. Dépendances de 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ée ici.

3. Transférer

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 obtenons la référence RequestDispatcher du servlet parent et la pointons vers une autre ressource serveur.

En termes simples, cela transmettra la demande.

Lorsqu'un client soumet une requête à // localhost: 8081 / hello? Name = Dennis , cette logique s'exécute et la requête est transmise à « / forwarded ».

4. Rediriger

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

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

Nous utilisons l'objet de réponse d'origine pour rediriger cette requête vers une autre URL : " / redirected".

Lorsqu'un client soumet une demande à // localhost: 8081 / welcome? Name = Dennis , la demande sera redirigée vers // localhost: 8081 / redirigée.

Pour en savoir plus sur les redirections dans le contexte de Spring, consultez notre article dédié ici.

5. Différences

Nous avons passé le paramètre « nom » avec une valeur dans les deux cas. En termes simples, les demandes transférées portent toujours cette valeur, mais pas les demandes redirigées.

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 l'enregistrer dans l' objet HttpSession .

Voici une liste des principales différences entre la transmission de servlet et la redirection:

En avant :

  • La demande sera ensuite traitée côté serveur
  • Le client n'est pas affecté par le transfert, l'URL dans un navigateur reste la même
  • Les objets de demande et de réponse resteront le même objet après le transfert. Les objets de la portée de la requête seront toujours disponibles

Rediriger :

  • 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 Post / Redirect / Get

6. Conclusion

Le transfert et la redirection concernent tous deux l'envoi d'un utilisateur vers des ressources différentes, bien que leur sémantique soit 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 que l'application souhaite également effectuer une action interne, utilisez le transfert .

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, utilisez la redirection .

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