RequestDispatcher.forward() vs HttpServletResponse.sendRedirect()
Какова концептуальная разница между forward()
и sendRedirect()
?
Ответы
Ответ 1
requestDispatcher - метод forward()
-
Когда мы используем метод forward
, запрос передается другому ресурсу на том же сервере для дальнейшей обработки.
-
В случае forward
, веб-контейнер обрабатывает всю обработку внутренне, и клиент или браузер не вовлечены.
-
Когда forward
requestDispatcher
объекта requestDispatcher
, мы передаем объекты request и response, поэтому наш старый объект request присутствует в новом ресурсе, который будет обрабатывать наш запрос.
-
Визуально мы не можем видеть переадресованный адрес, он прозрачный.
-
Использование метода forward()
быстрее, чем sendRedirect
.
-
Когда мы перенаправляем с использованием forward и хотим использовать те же данные в новом ресурсе, мы можем использовать request.setAttribute()
как у нас есть объект запроса.
SendRedirect
-
В случае sendRedirect
запрос передается другому ресурсу, другому домену или другому серверу для дальнейшей обработки.
-
Когда вы используете sendRedirect
, контейнер передает запрос клиенту или браузеру, поэтому URL-адрес, указанный в методе sendRedirect
отображается как новый запрос для клиента.
-
В случае вызова sendRedirect
старые объекты запроса и ответа теряются, поскольку браузер рассматривает их как новый запрос.
-
В адресной строке мы можем увидеть новый перенаправленный адрес. Это не прозрачно.
-
sendRedirect
работает медленнее, потому что требуется один дополнительный обход, потому что создается совершенно новый запрос, а старый объект запроса теряется. Требуется два запроса браузера.
-
Но в sendRedirect
, если мы хотим использовать, мы должны хранить данные в сеансе или передавать вместе с URL.
Какой из них хорош?
Это зависит от сценария, для которого метод является более полезным.
Если вы хотите, чтобы управление было перенесено на новый сервер или контекст, и это рассматривается как совершенно новая задача, тогда мы переходим к sendRedirect
. Как правило, следует использовать переадресацию, если операция может быть безопасно повторена после перезагрузки веб-страницы браузером и не повлияет на результат.
Источник
Ответ 2
В мире веб-разработки термин "перенаправление" означает отправку клиенту пустого 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
который контролирует, обрабатывает и обрабатывает запросы. JSPs в /WEB-INF
папку, непосредственно не доступны URL, но Servlet
может получить доступ к ним с помощью RequestDispatcher#forward()
.
Например, вы можете иметь JSP файл в /WEB-INF/login.jsp
и LoginServlet
который сопоставлен с url-pattern
/login
. Когда вы вызываете http://example.com/context/login
, будет вызван сервлет doGet()
. Там вы можете выполнить любую предварительную обработку и, наконец, переслать запрос:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Когда вы отправляете форму, вы обычно хотите использовать POST
:
<form action="login" method="post">
Таким образом, сервлет doPost()
будет вызываться и вы можете сделать любой постобработки материал там (например, проверка, бизнес - логика, логин пользователя, и т.д.).
Если есть какие-либо ошибки, обычно вы хотите перенаправить запрос обратно на ту же страницу и отобразить ошибки там рядом с полями ввода и так далее. Вы можете использовать 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.
}
Перенаправление, таким образом, инструктирует клиента запустить новый GET
для данного URL. Обновление запроса будет затем обновлять только перенаправленный запрос, а не первоначальный запрос. Это позволит избежать "двойных представлений", путаницы и плохого взаимодействия с пользователем. Это также называется шаблоном POST-Redirect-GET
.
Ответ 3
Интерфейс RequestDispatcher
позволяет вам делать серверную сторону вперед/включить, тогда как sendRedirect()
перенаправляет клиентскую сторону. При переадресации на стороне клиента сервер отправляет обратно код состояния HTTP 302
(временный переадресация), что заставляет веб-браузер выдавать новый HTTP GET
запрос на контент в перенаправленном местоположении. Напротив, при использовании интерфейса RequestDispatcher
включение/переключение на новый ресурс обрабатывается целиком на стороне сервера.
Ответ 4
Любой из этих методов может быть "лучше", то есть более подходящим, в зависимости от того, что вы хотите сделать.
Переадресация на стороне сервера выполняется быстрее, поскольку вы получаете данные с другой страницы, не совершая туда поездку в браузер. Но URL-адрес, просматриваемый в браузере, по-прежнему является исходным адресом, поэтому вы создаете небольшую несогласованность.
Переадресация на стороне клиента более универсальна, поскольку она может отправить вас на совершенно другой сервер или изменить протокол (например, с HTTP на HTTPS) или и то, и другое. И браузер узнает о новом URL-адресе. Но он требует дополнительной поддержки между сервером и клиентом.
Ответ 5
SendRedirect()
будет искать контент между серверами. он медленный, потому что он должен заинтриговать браузер, отправив URL-адрес контента. то браузер создаст новый запрос для содержимого на том же сервере или в другом.
RquestDispatcher
предназначен для поиска содержимого на сервере, который я думаю. его серверный процесс, и он быстрее сравнивается с методом SendRedirect()
. но дело в том, что он не будет интимным браузером, на котором он ищет нужную дату или контент, ни он не будет просить браузер изменить URL-адрес в URL-ссылке. поэтому это вызывает у пользователя неудобства.
Ответ 6
Основное важное различие между методом forward() и sendRedirect() заключается в том, что в случае forward() перенаправление происходит на конце сервера и невидимо для клиента, но в случае sendRedirect() перенаправление происходит на стороне клиента и становится видимым клиенту.
Ответ 7
Технически переадресация должна использоваться, если нам нужно передать управление в другой домен или добиться разделения задачи.
Например, в платежном приложении
сначала мы делаем PaymentProcess, а затем перенаправляем displayPaymentInfo. Если клиент обновляет браузер, только displayPaymentInfo будет выполнен снова, а PaymentProcess не будет повторяться. Но если мы будем использовать forward в этом сценарии, как PaymentProcess, так и displayPaymentInfo будут повторно выполняться последовательно, что может привести к несовместимым данным.
Для других сценариев форвард эффективен для использования, поскольку он быстрее, чем sendRedirect
Ответ 8
Request Dispatcher - это интерфейс, который используется для отправки запроса или ответа от веб-ресурса на другой веб-ресурс. Он содержит в основном два метода.
-
request.forward(req,res)
: этот метод используется для перенаправления запроса с одного веб-ресурса на другой ресурс. то есть от одного сервлета до другого сервлета или от одного веб-приложения до другого веб-приложения.
-
response.include(req,res)
: этот метод используется, включая ответ одного сервлета на другой сервлет
ПРИМЕЧАНИЕ. Используя диспетчер запросов, мы можем перенаправить или включить запрос или ответы на том же сервере.
request.sendRedirect()
: Используя это, мы можем перенаправить или включить запрос или ответы на разные серверы. В этом клиент получает намек при перенаправлении страницы, но в описанном выше процессе клиент не получит намека
Ответ 9
Диспетчер позволяет передавать данные запроса из одного сервлета в другой сервлет. Альтернативой диспетчера запросов является перенаправление отправки, но при каждом новом запросе перенаправление отправки возвращается в сеть, если в сервере происходит обратный диспетчер запросов.
пример
Диспетчер сервлетов в Java Давайте разберемся с концепцией диспетчера запросов на простом примере. Рассмотрим ситуацию, когда у нас есть три сервлета, названных как servlet1, servlet2 и Servlet3. В случае, если мы не используем диспетчер, всякий раз, когда мы запрашиваем сервлет1, сервер передает управление сервлету1, после этого, если мы запрашиваем сервлет2, управление возвращается из сервлета 1 на сервер и передается сервлету2. В этом случае, если сервер находится в Индии и сервлет запрашивается из Америки, для второго запроса он должен вернуться на сервер (Индия) и вернуться в сервлет (Америка). Этот вариант не годится, если между запросом и ответом интенсивный трафик. Решением этой проблемы является диспетчер.
Диспетчер сервлетов в Java В том же случае, если мы используем диспетчер внутри сервера, управление передается из сервлета1 в сервлет2 без возврата на сервер и без участия сети. Эта концепция также называется цепочкой сервлетов. Это называется цепочкой сервлетов, потому что мы создаем цепочку запросов сервлетов, от сервлета1 к сервлету2, сервлета2 к сервлету3, и сервер будет получать данные из сервлета3.
Передача данных
В цепочке сервлетов не только передается управление, но и данные передаются от одного сервлета к другому сервлету, что является основным преимуществом по сравнению с перенаправлением отправки. В перенаправлении отправки каждый запрос является новым запросом, каждый раз, когда вы получаете новые данные.
Предположим, что сервлет1 имеет некоторый параметр запроса, который должен быть выполнен сервлетом3, тогда данные могут перемещаться из сервлета1 в сервлет2, а затем из сервлета2 в сервлет3, поэтому здесь мы сохраняем запрос от одного сервлета к другому сервлету.
Срок действия запроса очень мал, как только мы получаем ответ, запрос заканчивается, но здесь срок действия запроса можно сохранить от одного сервлета к другому. С помощью этого мы можем разделить задачу на множество сервлетов.
Недостаток
Диспетчер в большинстве случаев эффективен, но в случае больших данных или если нам вообще не нужны данные или в случае низкого трафика, отправьте работу перенаправления эффективно.
Ответ 10
Просто разница между Forward(ServletRequest request, ServletResponse response)
и sendRedirect(String url)
- это
вперед():
- Метод
forward()
выполняется на стороне сервера. - Запрос переносится на другой ресурс внутри того же сервера.
- Он не зависит от протокола запроса клиентов, поскольку метод
forward()
предоставляется контейнером сервлета. - Запрос разделяется целевым ресурсом.
- В этом методе используется только один вызов.
- Это может быть использовано внутри сервера.
- Мы не можем видеть перенаправленное сообщение, оно прозрачное.
- Метод
forward()
работает быстрее, чем sendRedirect()
. - Это объявлено в интерфейсе
RequestDispatcher
.
sendRedirect():
- Метод sendRedirect() выполняется на стороне клиента.
- Запрос переносится на другой ресурс на другой сервер.
- Метод sendRedirect() предоставляется в разделе HTTP, поэтому его можно использовать только с клиентами HTTP.
- Новый запрос создан для ресурса назначения.
- Два запроса и ответных вызовов потребляются.
- Может использоваться внутри и за пределами сервера.
- Мы видим перенаправленный адрес, он не прозрачен.
- Метод sendRedirect() медленнее, потому что при создании нового запроса старый объект запроса теряется.
- Это объявлено в HttpServletResponse.