143 votes

RequestDispatcher.forward() vs HttpServletResponse.sendRedirect()

Quelle est la différence conceptuelle entre forward() et sendRedirect() ?

176voto

BalusC Points 498232

Dans le monde du développement web, le terme "redirection" désigne l'action d'envoyer au client une réponse HTTP vide, avec seulement un mot de passe. Location contenant la nouvelle URL à laquelle le client doit envoyer une toute nouvelle demande GET. Donc, en gros :

  • Le client envoie une requête HTTP à some.jsp .
  • Le serveur renvoie une réponse HTTP avec Location: other.jsp en-tête
  • Le client envoie une requête HTTP à other.jsp (cela se reflète dans la barre d'adresse du navigateur !)
  • Le serveur renvoie une réponse HTTP avec le contenu suivant other.jsp .

Vous pouvez le suivre avec les outils de développement intégrés ou complémentaires du navigateur Web. Appuyez sur F12 dans Chrome/IE9/Firebug et vérifiez la section "Réseau" pour le voir.

Exactement ce qui précède est réalisé par sendRedirect("other.jsp") . Le site RequestDispatcher#forward() n'envoie pas de redirection. Au lieu de cela, il utilise le contenu de la page cible comme réponse HTTP.

  • Le client envoie une requête HTTP à some.jsp .
  • Le serveur renvoie une réponse HTTP avec le contenu suivant other.jsp .

Cependant, comme la requête HTTP originale était destinée à some.jsp l'URL dans la barre d'adresse du navigateur reste inchangée. De même, tous les attributs de requête définis dans le contrôleur derrière l'élément some.jsp sera disponible en other.jsp . Cela ne se produit pas lors d'une redirection, car vous forcez le client à créer un fichier nouveau Demande HTTP sur other.jsp en rejetant ainsi la demande initiale sur some.jsp y compris tous ses attributs.


Le site RequestDispatcher est extrêmement utile dans le paradigme MVC et/ou lorsque vous voulez cacher les JSP d'un accès direct. Vous pouvez placer les JSP dans le répertoire /WEB-INF et utiliser un Servlet qui contrôle, pré-traite et post-traite les demandes. Les JSPs dans le /WEB-INF ne sont pas directement accessibles par l'URL, mais le dossier Servlet peut y accéder en utilisant RequestDispatcher#forward() .

Vous pouvez par exemple avoir un fichier JSP dans le répertoire /WEB-INF/login.jsp et un LoginServlet qui est mappé sur un url-pattern de /login . Lorsque vous invoquez http://example.com/context/login alors l'élément doGet() sera invoquée. Vous pouvez faire pré le traitement des affaires là-dedans et finalement avant la demande comme :

request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);

Lorsque vous soumettez un formulaire, vous voulez normalement utiliser POST :

<form action="login" method="post">

De cette façon, la servlet doPost() sera invoqué et vous pourrez faire tout poste le traitement des données qui s'y trouvent (par exemple, la validation, la logique commerciale, la connexion de l'utilisateur, etc.)

S'il y a des erreurs, alors vous devez normalement avant la demande est renvoyée à la même page et les erreurs sont affichées à côté des champs de saisie, etc. Vous pouvez utiliser la fonction RequestDispatcher pour ça.

Si un POST est réussie, vous voulez normalement rediriger la demande, afin qu'elle ne soit pas soumise à nouveau lorsque l'utilisateur actualise la demande (par exemple en appuyant sur F5 ou en remontant dans l'historique).

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
    request.setAttribute("error", "Unknown login, please try again."); // Set error.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}

A rediriger demande donc au client de lancer un nouveau GET sur l'URL donnée. L'actualisation de la demande ne rafraîchira alors que la demande redirigée et non la demande initiale. Cela évitera les "doubles soumissions", la confusion et les mauvaises expériences des utilisateurs. Cette méthode est également appelée POST-Redirect-GET motif .

Voir aussi :

0 votes

Lorsque je redirige d'une servlet vers une page jsp, la page jsp est partiellement chargée, comme dans le cas suivant stackoverflow.com/questions/12337624/ . Je voulais que la première chose à courir quand quelqu'un frappait foo.com soit le servlet. A partir de la servlet, je fais un response.sendRedirect("..") vers la page index.jsp du site web. Mais cela ne tient pas compte des fichiers css et de certains textes de la page jsp, ce qui entraîne un chargement partiel de la page. Mais lorsque je fais en sorte que la page d'accueil du site soit index.jsp, tout fonctionne bien et la page se charge complètement. Quel est le problème avec la redirection ?

116voto

requestDispatcher - méthode forward()

  1. Lorsque nous utilisons le forward la demande est transférée à une autre ressource du même serveur pour la suite du traitement.

  2. Dans le cas de forward En effet, le conteneur web gère tout le traitement en interne et le client ou le navigateur n'est pas impliqué.

  3. Lorsque forward est appelé sur le requestDispatcher nous passons les objets requête et réponse, ainsi notre ancien objet requête est présent sur la nouvelle ressource qui va traiter notre requête.

  4. Visuellement, nous ne sommes pas en mesure de voir l'adresse transférée, elle est transparente.

  5. Utilisation de la forward() est plus rapide que la méthode sendRedirect .

  6. Lorsque nous redirigeons en utilisant forward, et que nous voulons utiliser les mêmes données dans une nouvelle ressource, nous pouvons utiliser request.setAttribute() car nous avons un objet de demande disponible.

SendRedirect

  1. En cas de sendRedirect la demande est transférée à une autre ressource, à un autre domaine ou à un autre serveur pour la suite du traitement. ou à un autre serveur pour la suite du traitement.

  2. Lorsque vous utilisez sendRedirect le conteneur transfère la demande au client ou au navigateur, de sorte que l'URL donnée à l'intérieur de la balise sendRedirect est visible comme une nouvelle requête pour le client.

  3. En cas de sendRedirect les anciens objets de demande et de réponse sont perdus car le navigateur les traite comme de nouvelles demandes.

  4. Dans la barre d'adresse, nous pouvons voir la nouvelle adresse redirigée. Ce n'est pas transparent.

  5. sendRedirect est plus lent parce qu'un aller-retour supplémentaire est nécessaire, car une demande entièrement nouvelle est créée et l'ancien objet de demande est perdu. Deux requêtes de navigateur sont nécessaires.

  6. Mais en sendRedirect Si nous voulons utiliser les mêmes données pour une nouvelle ressource, nous devons stocker les données en session ou les transmettre avec l'URL.

Laquelle est la bonne ?

Cela dépend du scénario pour lequel la méthode est la plus utile.

Si vous souhaitez que le contrôle soit transféré vers un nouveau serveur ou un nouveau contexte, et qu'il soit traité comme une tâche complètement nouvelle, alors nous optons pour sendRedirect . En général, un forward doit être utilisé si l'opération peut être répétée en toute sécurité lors d'un rechargement de la page Web par le navigateur et si elle n'affecte pas le résultat.

Source :

22voto

Asaph Points 56989

Le site RequestDispatcher vous permet de faire un forward/include côté serveur alors que sendRedirect() fait une redirection côté client. Dans une redirection côté client, le serveur renvoie un code d'état HTTP égal à 302 (redirection temporaire) qui amène le navigateur web à émettre un tout nouveau HTTP GET pour le contenu de l'emplacement redirigé. En revanche, lorsque l'on utilise la méthode RequestDispatcher l'inclusion/le transfert vers la nouvelle ressource est entièrement géré du côté du serveur.

0 votes

Et ce dernier est en fait forward pas de redirection.

5voto

Carl Smotricz Points 36400

L'une ou l'autre de ces méthodes peut être "meilleure", c'est-à-dire plus adaptée, en fonction de ce que vous voulez faire.

Une redirection côté serveur est plus rapide dans la mesure où vous obtenez les données d'une page différente sans faire d'aller-retour vers le navigateur. Mais l'URL affichée dans le navigateur reste l'adresse d'origine, ce qui crée une petite incohérence.

Une redirection côté client est plus polyvalente dans la mesure où elle peut vous envoyer vers un serveur complètement différent, ou changer le protocole (par exemple de HTTP à HTTPS), ou les deux. Et le navigateur est conscient de la nouvelle URL. Mais cela nécessite un va-et-vient supplémentaire entre le serveur et le client.

2 votes

Ce segment juste là n'est pas assez mentionné sur le web : "ou changer le protocole (par exemple de HTTP à HTTPS), ou les deux"

3voto

Rajagonda Points 21

SendRedirect() recherche le contenu entre les serveurs. Il est lent car il doit informer le navigateur en lui envoyant l'URL du contenu, puis le navigateur crée une nouvelle demande pour le contenu dans le même serveur ou dans un autre.

RquestDispatcher sert à rechercher le contenu dans le serveur, je pense. C'est le processus côté serveur et il est plus rapide que le processus côté serveur. SendRedirect() mais le problème est qu'il n'indiquera pas au navigateur dans quel serveur il recherche la date ou le contenu requis, et il ne demandera pas non plus au navigateur de changer l'URL dans l'onglet URL. il cause donc un petit inconvénient à l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X