RequestDispatcher.forward () против HttpServletResponse.sendRedirect () - PullRequest
114 голосов
/ 12 января 2010

В чем концептуальная разница между forward() и sendRedirect()?

Ответы [ 10 ]

156 голосов
/ 12 января 2010

В мире веб-разработки термин «перенаправление» означает отправку клиенту пустого HTTP-ответа с заголовком Location, содержащим новый URL-адрес, на который клиент должен отправить совершенно новый запрос GET. Итак, в основном:

  • Клиент отправляет HTTP-запрос на some.jsp.
  • Сервер отправляет ответ HTTP с заголовком Location: other.jsp
  • Клиент отправляет HTTP-запрос на other.jsp (это отражается в адресной строке браузера!)
  • Сервер отправляет ответ HTTP обратно с содержанием other.jsp.

Вы можете отслеживать это с помощью встроенного в браузер набора инструментов разработчика. Нажмите F12 в Chrome / IE9 / Firebug и проверьте раздел «Сеть», чтобы увидеть его.

Именно это достигается с помощью sendRedirect("other.jsp"). RequestDispatcher#forward() не отправляет перенаправление. Вместо этого он использует содержимое целевой страницы в качестве ответа HTTP.

  • Клиент отправляет HTTP-запрос на some.jsp.
  • Сервер отправляет ответ HTTP обратно с содержанием other.jsp.

Однако, поскольку исходный HTTP-запрос был some.jsp, URL-адрес в адресной строке браузера остается неизменным.


RequestDispatcher чрезвычайно полезен в парадигме MVC и / или когда вы хотите скрыть JSP от прямого доступа. Вы можете поместить JSP в папку /WEB-INF и использовать Servlet, который контролирует, обрабатывает и обрабатывает запросы. JSP в папке /WEB-INF не доступны напрямую по URL, но Servlet может получить к ним доступ, используя RequestDispatcher#forward().

Например, вы можете иметь файл JSP в /WEB-INF/login.jsp и LoginServlet, который сопоставлен с url-pattern из /login. Когда вы вызываете http://example.com/context/login, то сервлет doGet() будет вызван. Вы можете выполнить любую обработку pre и, наконец, forward запрос, например:

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

Когда вы отправляете форму, вы обычно хотите использовать POST:

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

Таким образом, будет вызываться doPost() сервлета, и вы можете выполнять там любые обработки post (например, проверку, бизнес-логику, вход в систему пользователя и т. Д.).

Если есть какие-либо ошибки, обычно вы хотите переслать запрос обратно на ту же страницу и отображать там ошибки рядом с полями ввода и так далее. Вы можете использовать RequestDispatcher для этого.

Если POST успешен, вы обычно хотите перенаправить запрос, чтобы запрос не был повторно отправлен, когда пользователь обновит запрос (например, нажав F5 или вернувшись назад в истории) ,

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 дает клиенту команду выполнить новый запрос GET по указанному URL. Обновление запроса будет затем обновлять только перенаправленный запрос, а не первоначальный запрос. Это позволит избежать «двойных представлений», путаницы и плохого взаимодействия с пользователем. Это также называется POST-Redirect-GET паттерн .

94 голосов
/ 10 октября 2013

requestDispatcher - метод forward ()

  1. Когда мы используем метод forward, запрос передается другому ресурсу на том же сервере для дальнейшей обработки.

  2. В случае forward веб-контейнер обрабатывает всю обработку внутренне, а клиент или браузер не задействованы.

  3. Когда forward вызывается для объекта requestDispatcher, мы передаем объекты запроса и ответа, поэтому наш старый объект запроса присутствует в новом ресурсе, который будет обрабатывать наш запрос.

  4. Визуально мы не можем видеть переадресованный адрес, он прозрачный.

  5. Использование метода forward() быстрее, чем sendRedirect.

  6. Когда мы перенаправляем с использованием пересылки и хотим использовать те же данные в новом ресурсе, мы можем использовать request.setAttribute(), поскольку у нас есть объект запроса.

SendRedirect

  1. В случае sendRedirect запрос переносится на другой ресурс, в другой домен или в другой сервер для дальнейшей обработки.

  2. Когда вы используете sendRedirect, контейнер передает запрос клиенту или браузеру, поэтому URL-адрес, указанный в методе sendRedirect, отображается как новый запрос для клиента.

  3. В случае вызова sendRedirect старые объекты запроса и ответа теряются, поскольку браузер рассматривает их как новый запрос.

  4. В адресной строке мы можем видеть новый перенаправленный адрес. Это не прозрачно.

  5. sendRedirect медленнее, потому что требуется одно дополнительное обратное путешествие, потому что создается совершенно новый запрос, а старый объект запроса теряется. Требуется два запроса браузера.

  6. Но в sendRedirect, если мы хотим использовать, мы должны хранить данные в сеансе или передавать вместе с URL.

Какой из них хорош?

Это зависит от сценария, для которого метод более полезен.

Если вы хотите, чтобы управление было перенесено на новый сервер или в контекст, и оно рассматривается как совершенно новая задача, тогда мы перейдем к sendRedirect. Как правило, следует использовать переадресацию, если операция может быть безопасно повторена после перезагрузки веб-страницы браузером и не повлияет на результат.

Источник

19 голосов
/ 12 января 2010

Интерфейс RequestDispatcher позволяет выполнять пересылку / включение на стороне сервера, тогда как sendRedirect() выполняет перенаправление на стороне клиента. При перенаправлении на стороне клиента сервер отправит обратно код состояния HTTP 302 (временное перенаправление), в результате чего веб-браузер отправит новый запрос HTTP GET на контент в перенаправленном местоположении. Напротив, при использовании интерфейса RequestDispatcher включение / пересылка в новый ресурс полностью обрабатывается на стороне сервера.

3 голосов
/ 08 января 2013

SendRedirect() будет искать содержимое между серверами. это медленно, потому что он должен закрыть браузер, отправив URL-адрес содержимого. затем браузер создаст новый запрос контента на том же сервере или на другом.

RquestDispatcher - для поиска контента на сервере, я думаю. это процесс на стороне сервера, и он быстрее по сравнению с методом SendRedirect(). но дело в том, что он не будет информировать браузер, на каком сервере он ищет требуемую дату или контент, и не будет просить браузер изменить URL-адрес на вкладке URL. так что это доставляет мало неудобств пользователю.

3 голосов
/ 12 января 2010

Любой из этих методов может быть «лучше», то есть более подходящим, в зависимости от того, что вы хотите сделать.

Перенаправление на стороне сервера происходит быстрее, поскольку вы получаете данные с другой страницы, не обращаясь к браузеру. Но URL-адрес, видимый в браузере, по-прежнему является исходным, поэтому вы создаете небольшое несоответствие.

Перенаправление на стороне клиента является более универсальным, поскольку оно может отправить вас на совершенно другой сервер или изменить протокол (например, с HTTP на HTTPS) или и то, и другое. И браузер знает о новом URL. Но между сервером и клиентом требуется дополнительная перемотка вперед и назад.

2 голосов
/ 19 июля 2018

Основное важное различие между методом forward () и sendRedirect () заключается в том, что в случае forward () происходит перенаправление на стороне сервера и не виден клиенту, но в случае sendRedirect (), перенаправление происходит на стороне клиента, и это видно клиент.

enter image description here

1 голос
/ 20 июня 2014

Технически следует использовать перенаправление, если нам нужно перенести управление в другой домен или добиться разделения задачи.

Например в платежном приложении сначала мы делаем PaymentProcess, а затем перенаправляем на displayPaymentInfo. Если клиент обновляет браузер, только displayPaymentInfo будет выполнен снова, а PaymentProcess повторяться не будет. Но если мы будем использовать пересылку в этом сценарии, и PaymentProcess, и displayPaymentInfo будут выполняться повторно последовательно, что может привести к появлению недостоверных данных.

Для других сценариев эффективнее использовать forward, поскольку он быстрее sendRedirect

0 голосов
/ 24 мая 2019

Просто разница между Forward(ServletRequest request, ServletResponse response) и sendRedirect(String url) равна

вперед ():

  1. Метод forward() выполняется на стороне сервера.
  2. Запрос переносится на другой ресурс на том же сервере.
  3. Он не зависит от протокола запроса клиента, поскольку контейнер сервлета предоставляет метод forward ().
  4. Запрос совместно используется целевым ресурсом.
  5. В этом методе используется только один вызов.
  6. Может использоваться на сервере.
  7. Мы не можем видеть перенаправленное сообщение, оно прозрачное.
  8. Метод forward() работает быстрее, чем метод sendRedirect().
  9. Объявлено в RequestDispatcher интерфейсе.

sendRedirect ():

  1. Метод sendRedirect () выполняется на стороне клиента.
  2. Запрос переносится на другой ресурс на другой сервер.
  3. Метод sendRedirect () предоставляется по протоколу HTTP, поэтому его можно использовать только с клиентами HTTP.
  4. Создан новый запрос для ресурса назначения.
  5. Используются два запроса и ответные вызовы.
  6. Может использоваться внутри и за пределами сервера.
  7. Мы видим перенаправленный адрес, он не прозрачный.
  8. Метод sendRedirect () медленнее, потому что при создании нового запроса старый объект запроса теряется.
  9. Это объявлено в HttpServletResponse.
0 голосов
/ 16 апреля 2019

Диспетчер позволяет передавать данные запроса от одного сервлета к другому сервлету. Альтернативой диспетчера запросов является перенаправление отправки, но для каждого нового запроса перенаправление отправки возвращается в сеть, если в сервере происходит обратный диспетчер запросов.

Пример

Диспетчер сервлетов на Java Давайте разберемся с концепцией диспетчера запросов на простом примере. Рассмотрим ситуацию, когда у нас есть три сервлета, названных как servlet1, servlet2 и Servlet3. В случае, если мы не используем диспетчер, всякий раз, когда мы запрашиваем сервлет1, сервер передает управление сервлету1, после этого, если мы запрашиваем сервлет2, управление возвращается из сервлета 1 на сервер и передается сервлету2. В этом случае, если сервер находится в Индии и сервлет запрашивается из Америки, для второго запроса он должен вернуться на сервер (Индия) и вернуться в сервлет (Америка). Этот вариант не годится, если между запросом и ответом интенсивный трафик. Решением этой проблемы является диспетчер.

Диспетчер сервлетов в Java В том же случае, если мы используем диспетчер внутри сервера, управление передается от сервлета 1 к сервлету 2 без возврата на сервер и без участия сети. Эта концепция также называется цепочкой сервлетов. Это называется цепочкой сервлетов, потому что мы создаем цепочку запросов сервлетов, от сервлета1 к сервлету2, сервлета2 к сервлету3, и сервер будет получать данные из сервлета3.

Передача данных

В цепочке сервлетов не только передается управление, но и данные передаются от одного сервлета к другому сервлету, что является основным преимуществом по сравнению с перенаправлением отправки. В перенаправлении отправки каждый запрос является новым запросом, каждый раз, когда вы получаете новые данные.

Учтите, что сервлет1 имеет некоторый параметр запроса, который должен быть выполнен сервлетом3, тогда данные могут перемещаться из сервлета1 в сервлет2, а затем из сервлета2 в сервлет3, поэтому здесь мы сохраняем запрос от одного сервлета к другому сервлету.

Срок действия запроса очень мал, как только мы получим ответ, запрос закончится, но здесь жизнь запроса можно сохранить от одного сервлета к другому. С помощью этого мы можем разделить задачу на множество сервлетов.

Недостаток

Большую часть времени диспетчер работает эффективно, но в случае больших данных или если нам вообще не нужны данные или в случае низкого трафика, отправьте работу по перенаправлению эффективно.

0 голосов
/ 24 июня 2013

Request Dispatcher - это интерфейс, который используется для отправки запроса или ответа от веб-ресурса на другой веб-ресурс. Он содержит в основном два метода.

  1. request.forward(req,res): Этот метод используется для перенаправления запроса с одного веб-ресурса на другой ресурс. то есть из одного сервлета в другой сервлет или из одного веб-приложения в другое веб-приложение.

  2. response.include(req,res): этот метод включает ответ одного сервлета на другой сервлет

ПРИМЕЧАНИЕ. Используя диспетчер запросов, мы можем пересылать или включать запрос или ответы на одном сервере.

request.sendRedirect(): С помощью этого мы можем пересылать или включать запросы или ответы на разные серверы. При этом клиент получает указание при перенаправлении страницы, но в вышеописанном процессе клиент не получит указание

...