web-dev-qa-db-fra.com

RequestDispatcher.forward () vs HttpServletResponse.sendRedirect ()

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

116
RKCY

requestDispatcher - Méthode forward ()

  1. Lorsque nous utilisons la méthode forward, la demande est transférée vers une autre ressource du même serveur pour un traitement ultérieur.

  2. Dans le cas de forward, 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 l'objet requestDispatcher, nous transmettons les objets requête et réponse. Notre ancien objet request est donc présent sur la nouvelle ressource qui va traiter notre requête.

  4. Visuellement, nous ne pouvons pas voir l'adresse transmise, elle est transparente.

  5. L'utilisation de la méthode forward() est plus rapide que 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 request disponible.

SendRedirect

  1. Dans le cas de sendRedirect, la demande est transférée à une autre ressource, à un autre domaine ou à un autre serveur pour traitement ultérieur.

  2. Lorsque vous utilisez sendRedirect, le conteneur transfère la demande au client ou au navigateur. L'URL indiquée dans la méthode sendRedirect est donc visible en tant que nouvelle demande au client.

  3. En cas d’appel sendRedirect, les anciens objets de requête et de réponse sont perdus car ils sont traités comme une nouvelle requête par le navigateur.

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

  5. sendRedirect est plus lent car un aller-retour supplémentaire est requis, car une toute nouvelle requête est créée et l'ancien objet de requête est perdu. Deux demandes de navigateur sont requises.

  6. Mais dans sendRedirect, si nous voulons utiliser, nous devons stocker les données en session ou les transmettre avec l'URL.

Lequel est bon?

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

Si vous voulez 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 choisissons sendRedirect. Généralement, un transfert doit être utilisé si l'opération peut être répétée en toute sécurité lors du rechargement de la page Web par le navigateur et n'affectera pas le résultat.

Source

97

Dans le monde du développement Web, le terme "redirection" est l'acte consistant à envoyer au client une réponse HTTP vide avec juste un en-tête Location contenant la nouvelle adresse URL à laquelle le client doit envoyer une nouvelle demande GET. Donc en gros:

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

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

Exactement ce qui précède est atteint par sendRedirect("other.jsp"). La 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 envoie une réponse HTTP avec le contenu de other.jsp.

Cependant, comme la demande HTTP initiale était de some.jsp, L'URL dans la barre d'adresse du navigateur reste inchangé.


Le RequestDispatcher est extrêmement utile dans le paradigme MVC et/ou lorsque vous souhaitez masquer les JSP d'un accès direct. Vous pouvez placer les JSP dans le dossier /WEB-INF Et utiliser un Servlet qui contrôle, pré-traite et post-traite les demandes. Les fichiers JSP du dossier /WEB-INF Ne sont pas directement accessibles par URL, mais le Servlet peut y accéder à l'aide de RequestDispatcher#forward().

Vous pouvez par exemple avoir un fichier JSP dans /WEB-INF/login.jsp Et un LoginServlet qui est mappé sur un url-pattern De /login. Lorsque vous appelez http://example.com/context/login, La doGet() du servlet sera invoquée. Vous pouvez faire n'importe quoi prétraiter les éléments et enfin faire suivre la requête comme suit:

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

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

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

De cette façon, la doPost() du servlet sera invoquée et vous pourrez faire n'importe quelle postertraiter les éléments qui s'y trouvent (validation, logique d’entreprise, connexion de l’utilisateur, etc.).

S'il y a des erreurs, vous voudrez normalement renvoyer la demande à la même page et afficher les erreurs à côté des champs de saisie, etc. . Vous pouvez utiliser le RequestDispatcher pour cela.

Si un POST réussit, vous souhaitez normalement rediriger la demande afin que la demande 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.
}

Une redirection indique donc au client de lancer une nouvelle requête GET sur l'URL donnée. L'actualisation de la demande actualisera alors uniquement la demande redirigée et non la demande initiale. Cela évitera les "doubles soumissions", la confusion et les mauvaises expériences des utilisateurs. C'est ce qu'on appelle aussi le motif POST-Redirect-GET .

156
BalusC

L’interface RequestDispatcher vous permet d’effectuer un transfert/une inclusion côté serveur, tandis que sendRedirect() effectue une redirection côté client. Dans une redirection côté client, le serveur renvoie un code de statut HTTP de 302 (redirection temporaire) qui entraîne le navigateur Web à émettre une toute nouvelle requête HTTP GET pour le contenu à l'emplacement redirigé. En revanche, lors de l'utilisation de l'interface RequestDispatcher , l'inclusion/le transfert vers la nouvelle ressource est entièrement géré du côté serveur.

19
Asaph

SendRedirect() recherchera le contenu entre les serveurs. il est lent car il doit intimer le navigateur en envoyant l'URL du contenu. alors le navigateur créera une nouvelle demande pour le contenu sur le même serveur ou sur un autre.

RquestDispatcher est destiné à la recherche de contenu sur le serveur, je pense. C'est le processus côté serveur et il est plus rapide comparé à la méthode SendRedirect(). mais le fait est que le navigateur sur lequel le serveur ne recherche pas la date ou le contenu requis n'est pas intime, pas plus qu'il ne demande au navigateur de modifier l'URL dans l'onglet URL. cela cause donc peu d'inconvénients à l'utilisateur.

3
Rajagonda

Chacune de ces méthodes peut être "meilleure", c'est-à-dire plus appropriée, en fonction de ce que vous souhaitez faire.

Une redirection côté serveur est plus rapide dans la mesure où vous obtenez les données d'une page différente sans effectuer d'aller-retour vers le navigateur. Mais l'URL affichée dans le navigateur est toujours l'adresse d'origine. Vous créez donc 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 modifier le protocole (par exemple de HTTP à HTTPS), ou les deux. Et le navigateur est conscient de la nouvelle URL. Mais cela prend un va-et-vient supplémentaire entre le serveur et le client.

3
Carl Smotricz

La principale différence importante entre les méthodes forward () et sendRedirect () est que, dans le cas de forward (), la redirection s'effectue du côté du serveur et n'est pas visible par le client, mais dans le cas de sendRedirect (). , la redirection se produit à la fin du client et est visible pour le client.

enter image description here

2
Joby Wilson Mathews

Techniquement, la redirection devrait être utilisée si nous devons transférer le contrôle à un domaine différent ou bien pour séparer les tâches.

Par exemple, dans l'application de paiement, nous effectuons d'abord PaymentProcess, puis nous redirigeons vers displayPaymentInfo. Si le client actualise le navigateur, seul displayPaymentInfo sera refait et PaymentProcess ne sera pas répété. Mais si nous utilisons forward dans ce scénario, PaymentProcess et displayPaymentInfo seront ré-exécutés séquentiellement, ce qui peut entraîner des données incohérentes.

Pour les autres scénarios, l’utilisation de forward est efficace car plus rapide que sendRedirect

1
Rohit Goyal

Dispatcher permet aux données de requête de voyager d'un servlet à un autre. La variante du répartiteur de demandes est la redirection d'envoi, mais pour chaque nouvelle requête, la redirection renvoie au réseau, mais le répartiteur de requêtes se produit au sein du serveur.

Exemple

Servlet Dispatcher In Java Comprenons le concept de répartiteur de demandes avec un exemple simple. Considérez le cas où nous avons trois servlets nommés servlet1, servlet2 et Servlet3. Dans le cas où nous n'utilisons pas le répartiteur, chaque fois demande pour servlet1, le serveur passe le contrôle à servlet1, après cela, si nous demandons servlet2, le contrôle revient du servlet 1 au serveur et est transmis à servlet 2. Dans ce cas, si le serveur est situé en Inde et que le servlet est demandé à l'Amérique, il est ensuite demandé il doit revenir au serveur (Inde) et revenir à servlet (Amérique). Cette option n'est pas bonne si le trafic est dense entre la demande et la réponse. La solution de ce problème est dispatcher.

Servlet Dispatcher In Java Dans le même cas, si nous utilisons un répartiteur dans le serveur, le contrôle est passé de servlet1 à servlet2 sans revenir au serveur et sans impliquer de réseau. Ce concept est également appelé chaînage de servlets. Il est appelé chaînage de servlets car nous créons une chaîne de demandes de servlets, de servlet1 à servlet2, de servlet2 à servlet3, et le serveur obtiendra les données de servlet3.

Transmission de données

Dans le chaînage de servlets, non seulement le contrôle est transmis, mais les données sont également acheminées d'un servlet à un autre, ce qui constitue un avantage majeur par rapport à l'envoi d'une redirection. Dans Send Redirect, chaque requête est une nouvelle requête, chaque fois que vous obtenez de nouvelles données.

Considérez que servlet1 a un paramètre de requête qui devrait être exécuté par servlet3, les données pouvant alors se déplacer de servlet1 à servlet2, puis de servlet2 à servlet3, nous préservons donc la requête d’un servlet à un autre servlet.

La durée de vie d'une requête est très petite, dès que nous obtenons une réponse, la requête est terminée mais la vie d'une requête peut être conservée d'une servlet à une autre. Avec l'aide de cela, nous pouvons diviser la tâche en plusieurs servlets.

Inconvénient

La plupart du temps, le répartiteur est efficace, mais en cas de données volumineuses ou si nous n’avons pas besoin de données du tout ou en cas de faible trafic, le travail de redirection est efficace.

0
Hitanshi Mehta

Request Dispatcher est une interface utilisée pour envoyer la demande ou la réponse d'une ressource Web à une autre ressource Web. Il contient principalement deux méthodes.

  1. request.forward(req,res): cette méthode est utilisée pour transférer la demande d'une ressource Web à une autre ressource. c'est-à-dire d'un servlet à un autre servlet ou d'une application Web à une autre application Web.

  2. response.include(req,res): cette méthode est utilisée pour inclure la réponse d'un servlet à un autre servlet

REMARQUE: En utilisant Request Dispatcher, nous pouvons transférer ou inclure la demande ou les réponses dans le même serveur.

request.sendRedirect(): En utilisant ceci, nous pouvons transférer ou inclure la demande ou les réponses sur les différents serveurs. En cela, le client reçoit une notification tout en redirigeant la page, mais dans le processus ci-dessus, il ne recevra aucune notification.

0
Ashwin Patil