RequestDispatcher.forward () vs HttpServletResponse.sendRedirect()

Jaka jest różnica pojęciowa między forward() a sendRedirect()?

Author: BalusC, 2010-01-12

8 answers

Metoda RequestDispatcher - forward ()

  1. Gdy używamy metody forward, żądanie jest przesyłane do innego zasobu na tym samym serwerze w celu dalszego przetwarzania.

  2. W przypadku forward, web container obsługuje cały proces wewnętrznie i klient lub przeglądarka nie jest zaangażowana.

  3. Po wywołaniu forward na obiekcie requestdispatcher przekazujemy obiekty request I response, więc nasz stary obiekt request jest obecny na nowym zasobie, który będzie przetworzyć naszą prośbę.

  4. Wizualnie nie jesteśmy w stanie zobaczyć przekazanego adresu, jest on przezroczysty.

  5. Użycie metody forward () jest szybsze niż send redirect.

  6. Kiedy przekierowujemy używając forward i chcemy użyć tych samych danych w nowym zasobie możemy użyć request.setAttribute (), ponieważ mamy obiekt request dostępny.

SendRedirect

  1. W przypadku sendredirect żądanie jest przenoszone do innego zasobu do Inna domena lub inny serwer do dalszego przetwarzania.

  2. Kiedy używasz sendRedirect, container przenosi żądanie do klienta lub przeglądarki, więc adres URL podany w metodzie sendRedirect jest widoczny jako nowe żądanie do klienta.

  3. W przypadku wywołania sendRedirect stare obiekty request I response są tracone, ponieważ przeglądarka traktuje je jako nowe żądanie.

  4. W pasku adresu możemy zobaczyć nowy przekierowany adres. Nie jest przezroczysty.

  5. SendRedirect jest wolniejszy, ponieważ wymagana jest jedna dodatkowa podróż w obie strony, ponieważ tworzone jest zupełnie nowe żądanie i stary obiekt żądania jest tracony. Wymagane są dwa żądania przeglądarki.

  6. Ale w sendRedirect, jeśli chcemy użyć musimy przechowywać dane w sesji lub przekazać wraz z adresem URL.

Która jest dobra?

To zależy od scenariusza, który metoda jest bardziej przydatna.

If you want control is transfer do nowego serwera lub kontekstu i jest traktowany jako zupełnie nowe zadanie, następnie przechodzimy na Wyślij przekierowanie. Ogólnie rzecz biorąc, należy użyć forward, jeśli operacja może być bezpiecznie powtórzona po przeładowaniu przeglądarki strony internetowej nie wpłynie na wynik.

Źródło

 82
Author: Abhijeet Ashok Muneshwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 14:11:47

Po pierwsze, termin "przekierowanie" jest w świecie web development działaniem wysyłania klientowi pustej odpowiedzi HTTP z tylko Location nagłówkiem z nim nowy adres URL, na który klient ma wysłać zupełnie nowe żądanie GET. Więc w zasadzie:

  • klient wysyła żądanie HTTP do some.jsp.
  • serwer wysyła odpowiedź HTTP z powrotem z Location: other.jsp nagłówkiem
  • klient wysyła żądanie HTTP do other.jsp (jest to widoczne w pasku adresu przeglądarki!)
  • serwer wysyła HTTP odpowiedź z treścią other.jsp.

Możesz go śledzić za pomocą wbudowanego zestawu narzędzi programistycznych webbrowser/addon. Naciśnij F12 w Chrome / IE9 / Firebug i sprawdź sekcję "sieć", aby ją zobaczyć.

Dokładnie to, co zostało osiągnięte przez sendRedirect("other.jsp"). RequestDispatcher#forward() nie wysyła przekierowania. Zamiast tego używa zawartości strony docelowej jako odpowiedzi HTTP.

  • klient wysyła żądanie HTTP do some.jsp.
  • serwer wysyła odpowiedź HTTP z zawartością other.jsp.

Jednak, ponieważ pierwotne żądanie HTTP było do some.jsp, adres URL w pasku adresu przeglądarki pozostaje niezmieniony.


{[13] } jest niezwykle przydatny w paradygmacie MVC i / lub gdy chcesz ukryć JSP przed bezpośrednim dostępem. Możesz umieścić pliki JSP w folderze /WEB-INF i użyć Servlet, który kontroluje, preprocesuje i postprocesuje żądania. JSP w folderze /WEB-INF nie są bezpośrednio dostępne przez URL, ale {[15] } może uzyskać do nich dostęp za pomocą RequestDispatcher#forward().

Możesz dla przykład zawiera plik JSP w /WEB-INF/login.jsp i LoginServlet, który jest mapowany na url-pattern z /login. Gdy wywołasz http://example.com/context/login, to wywołane zostaną serwlety doGet(). Możesz zrobić dowolne Preprzetwarzanie tam rzeczy i wreszcie prześlij żądanie typu:

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

Kiedy wysyłasz formularz, Zwykle chcesz użyć POST:

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

W ten sposób zostanie wywołany servlet doPost() i możesz wykonać dowolnepost przetwarzanie tam rzeczy (np. Walidacja, logika biznesowa, login użytkownika, itp.).

Jeśli są jakieś błędy, to zwykle chcesz przekazać żądanie z powrotem do tej samej strony i wyświetlić błędy obok pól wejściowych i tak dalej. Możesz użyć RequestDispatcher do tego.

Jeśli polecenie POST powiodło się, zwykle chcesz przekierować żądanie, aby nie było ponownie wysłane, gdy użytkownik odświeży żądanie (np. naciśnięcie klawisza F5 lub przejście wstecz do historii).

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 redirect w ten sposób instruuje klienta, aby odpalił nowe GET żądanie na podany adres URL. Odświeżenie żądania spowoduje jedynie odświeżenie przekierowanego żądania, a nie żądania początkowego. Pozwoli to uniknąć "podwójnych zgłoszeń" i zamieszania i złego doświadczenia użytkownika. Jest to również nazywane POST-Redirect-GET wzór .

 151
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-06 19:59:26

The RequestDispatcher interfejs pozwala na wykonanie strony serwera forward / includesendRedirect() czy strona klienta przekierowuje. W przypadku przekierowania po stronie klienta serwer wyśle kod statusu HTTP 302 (tymczasowe przekierowanie), co spowoduje, że przeglądarka internetowa wystawi zupełnie nowe żądanie HTTP GET dla treści w przekierowanej lokalizacji. Natomiast podczas korzystania z RequestDispatcher interfejs, include / forward do nowego zasobu jest obsługiwany w całości po stronie serwera.

 18
Author: Asaph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 06:51:09

Każda z tych metod może być "lepsza", tzn. bardziej odpowiednia, w zależności od tego, co chcesz zrobić.

Przekierowanie po stronie serwera jest szybsze, o ile otrzymujesz dane z innej strony bez przechodzenia w obie strony do przeglądarki. Ale adres URL widoczny w przeglądarce jest nadal oryginalnym adresem, więc tworzysz tam małą niespójność.

Przekierowanie po stronie klienta jest bardziej uniwersalne, ponieważ może wysłać cię na zupełnie inny serwer lub zmienić protokół (np. z HTTP do HTTPS) lub obu. A przeglądarka jest świadoma nowego adresu URL. Ale to wymaga dodatkowej pracy między serwerem a klientem.

 3
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-12 06:39:53

SendRedirect() przeszukuje zawartość między serwerami. jest powolny, ponieważ musi intymnie przeglądarkę wysyłając adres URL treści. następnie przeglądarka utworzy nowe żądanie zawartości na tym samym lub innym serwerze.

RquestDispatcher jest do przeszukiwania treści na serwerze, myślę. jest to proces po stronie serwera i jest szybszy w porównaniu do metody SendRedirect(). ale chodzi o to, że nie będzie w przeglądarce, na którym serwerze wyszukuje wymaganą datę lub treści, ani nie poprosi przeglądarki o zmianę adresu URL na karcie URL. powoduje to więc niewielkie niedogodności dla użytkownika.

 3
Author: Rajagonda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-08 07:32:50

Request Dispatcher jest interfejsem, który służy do wysyłania żądania lub odpowiedzi z zasobu sieciowego do innego zasobu sieciowego. Zawiera głównie dwie metody.

  1. request.forward(req,res): ta metoda jest używana do przekazywania żądania z jednego zasobu sieciowego do innego zasobu. tj. z jednego servletu na inny servlet lub z jednej aplikacji webowej na inną aplikację webową.

  2. response.include(req,res): ta metoda jest używana obejmuje odpowiedź jednego servleta na inny servlet

Uwaga: używając request Dispatcher możemy przesłać lub dołączyć żądanie lub odpowiedzi na tym samym serwerze.

request.sendRedirect(): korzystając z tego możemy przesłać lub dołączyć żądanie lub odpowiedzi na różne serwery. W tym przypadku Klient otrzymuje informację podczas przekierowywania strony, ale w powyższym procesie klient nie otrzyma informacji

 0
Author: Ashwin Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-24 09:55:14

Z technicznego punktu widzenia przekierowanie powinno być używane, jeśli chcemy przenieść kontrolę na inną domenę lub osiągnąć rozdzielenie zadania.

Na przykład we wniosku o płatność najpierw wykonujemy proces płatności, a następnie przekierowujemy do displayPaymentInfo. Jeśli klient odświeży przeglądarkę, tylko displayPaymentInfo zostanie wykonane ponownie i proces płatności nie zostanie powtórzony. Ale jeśli użyjemy forward w tym scenariuszu, zarówno PaymentProcess, jak i displayPaymentInfo zostaną ponownie wykonane kolejno, co może skutkować brakiem danych.

Dla innych scenariuszy, forward jest wydajny w użyciu, ponieważ jest szybszy niż sendRedirect

 0
Author: Rohit Goyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-20 09:03:16

Główną istotną różnicą między metodą forward() I sendredirect() jest to, że w przypadku forward () następuje przekierowanie na końcu serwera i nie widoczne dla klienta, ale w przypadku sendRedirect (), przekierowanie odbywa się na końcu klienta i jest widoczne dla klient.

Tutaj wpisz opis obrazka

 0
Author: Joby Wilson Mathews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 13:24:37