В чем концептуальная разница между forward()
и sendRedirect()
?
requestDispatcher - метод forward ()
Когда мы используем этот
forward
метод, запрос передается другому ресурсу на том же сервере для дальнейшей обработки.В случае
forward
, веб-контейнер обрабатывает всю внутреннюю обработку, а клиент или браузер не задействованы.Когда
forward
вызываетсяrequestDispatcher
объект, мы передаем объекты запроса и ответа, поэтому наш старый объект запроса присутствует на новом ресурсе, который будет обрабатывать наш запрос.Визуально мы не видим переадресованный адрес, он прозрачен.
Использование
forward()
метода быстрее, чемsendRedirect
.Когда мы перенаправляем с помощью переадресации и хотим использовать те же данные в новом ресурсе, мы можем использовать их,
request.setAttribute()
поскольку у нас есть доступный объект запроса.SendRedirect
В случае
sendRedirect
, запрос передается на другой ресурс, в другой домен или на другой сервер для дальнейшей обработки.Когда вы используете
sendRedirect
, контейнер передает запрос клиенту или браузеру, поэтому URL, указанный внутриsendRedirect
метода, виден как новый запрос для клиента.В случае
sendRedirect
вызова старые объекты запроса и ответа теряются, поскольку браузер обрабатывает их как новый запрос.В адресной строке мы видим новый перенаправленный адрес. Это не прозрачно.
sendRedirect
медленнее, потому что требуется один дополнительный круговой обход, поскольку создается совершенно новый запрос, а старый объект запроса теряется. Требуются два запроса браузера.Но
sendRedirect
если мы хотим использовать те же данные для нового ресурса, мы должны хранить данные в сеансе или передавать вместе с URL-адресом.Какой из них хороший?
Это зависит от сценария, для которого метод более полезен.
Если вы хотите, чтобы управление было передано новому серверу или контексту, и это рассматривается как совершенно новая задача, тогда мы идем
sendRedirect
. Как правило, следует использовать переадресацию, если операцию можно безопасно повторить при перезагрузке веб-страницы браузером и это не повлияет на результат.
В мире веб-разработки термин «перенаправление» - это отправка клиенту пустого HTTP-ответа с Location
заголовком, содержащим новый URL-адрес, на который клиент должен отправить новый запрос GET. Итак, в основном:
some.jsp
.Location: other.jsp
заголовкомother.jsp
(это отображается в адресной строке браузера!)other.jsp
.Вы можете отслеживать его с помощью встроенного набора инструментов разработчика / надстройки веб-браузера. Нажмите F12 в Chrome / IE9 / Firebug и проверьте раздел «Сеть», чтобы увидеть его.
Именно это достигается с помощью sendRedirect("other.jsp")
. RequestDispatcher#forward()
Не посылает редирект. Вместо этого он использует содержимое целевой страницы как HTTP-ответ.
some.jsp
.other.jsp
.Однако, поскольку исходный HTTP-запрос должен был some.jsp
, URL-адрес в адресной строке браузера остается неизменным. Кроме того, любые атрибуты запроса, установленные в контроллере позади, some.jsp
будут доступны в other.jsp
. Этого не происходит во время перенаправления, потому что вы в основном заставляете клиента создавать новый HTTP-запрос other.jsp
, тем самым отбрасывая исходный запрос, some.jsp
включая все его атрибуты.
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()
будет вызван . Вы можете выполнить любую предварительную обработку и, наконец, отправить запрос, например:
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
паттерном .
response.sendRedirect("..")
перехожу на страницу index.jsp веб-сайта. Но это пропускает файлы css и некоторый текст со страницы jsp, что приводит к частичной загрузке страницы. Но когда я делаю страницу приветствия сайта index.jsp, все работает нормально, и страница загружается. что не так с редиректом?RequestDispatcher
Интерфейс позволяет выполнять на стороне сервера вперед / включают в то время какsendRedirect()
делает на стороне клиента перенаправления. При перенаправлении на стороне клиента сервер отправляет обратно код состояния HTTP302
(временное перенаправление), что заставляет веб-браузер выдавать совершенно новый HTTP-GET
запрос для содержимого в перенаправленном месте. Напротив, при использованииRequestDispatcher
интерфейса включение / пересылка к новому ресурсу полностью выполняется на стороне сервера.источник
forward
не перенаправление.источник
Любой из этих методов может быть «лучше», т.е. более подходящим, в зависимости от того, что вы хотите сделать.
Перенаправление на стороне сервера происходит быстрее, поскольку вы получаете данные с другой страницы, не обращаясь к браузеру. Но URL-адрес, отображаемый в браузере, по-прежнему является исходным адресом, поэтому вы создаете здесь небольшую несогласованность.
Перенаправление на стороне клиента более универсально, поскольку оно может отправить вас на совершенно другой сервер или изменить протокол (например, с HTTP на HTTPS) или и то, и другое. И браузер знает о новом URL. Но для этого требуется дополнительный обмен данными между сервером и клиентом.
источник
SendRedirect()
будет искать контент между серверами. это медленно, потому что он должен интимизировать браузер, отправляя URL-адрес контента. тогда браузер создаст новый запрос контента на том же сервере или на другом.RquestDispatcher
я думаю, для поиска контента на сервере. это процесс на стороне сервера, и он быстрее по сравнению сSendRedirect()
методом. но дело в том, что он не будет указывать браузеру, на каком сервере он ищет требуемую дату или контент, а также не будет просить браузер изменить URL-адрес на вкладке URL. поэтому пользователю это не доставляет неудобств.источник
Технически редирект следует использовать либо в том случае, если нам нужно передать управление другому домену, либо для разделения задач.
Например, в платежном приложении мы сначала выполняем PaymentProcess, а затем перенаправляем на displayPaymentInfo. Если клиент обновляет браузер, только displayPaymentInfo будет выполнен снова, и PaymentProcess не будет повторяться. Но если мы используем в этом сценарии forward, как PaymentProcess, так и displayPaymentInfo будут повторно выполняться последовательно, что может привести к несостоятельности данных.
Для других сценариев переадресация эффективна, поскольку она быстрее, чем sendRedirect.
источник
Диспетчер запросов - это интерфейс, который используется для отправки запроса или ответа от веб-ресурса другому веб-ресурсу. Он содержит в основном два метода.
request.forward(req,res)
: Этот метод используется для пересылки запроса от одного веб-ресурса к другому ресурсу. т.е. от одного сервлета к другому сервлету или от одного веб-приложения к другому веб-приложению.response.include(req,res)
: Этот метод используется для включения ответа одного сервлета на другой сервлет.ПРИМЕЧАНИЕ. Используя диспетчер запросов, мы можем пересылать или включать запрос или ответы на том же сервере.
request.sendRedirect()
: Используя это, мы можем пересылать или включать запрос или ответы на разных серверах. В этом случае клиент получает указание при перенаправлении страницы, но в вышеуказанном процессе клиент не получит указаниеисточник
Просто разница между
Forward(ServletRequest request, ServletResponse response)
иsendRedirect(String url)
естьвперед():
forward()
Метод выполняется на стороне сервера.forward ()
метод предоставляется контейнером сервлета.forward()
Метод быстрее , чемsendRedirect()
метод.RequestDispatcher
интерфейсе.sendRedirect ():
источник