- Отличие forward от redirect java
- Русские Блоги
- Разница между Forward и Redirect в Java [! ! ! важный! ! ! 】
- оглавление
- обзор
- Метод прямой пересылки (forward)
- Косвенный метод переадресации (Redirect)
- принцип
- Непрямая пересылка запросов (Redirect)
- Прямая пересылка запросов (Forward)
- Сервлет Redirect или Forward?
- 2. Зависимости Maven
- 3. Вперед
- 4. Перенаправление
- 5. Отличия
- 6. Заключение
Отличие forward от redirect java
A Controller (in this context, an implementation of HttpServlet ) may perform either a forward or a redirect operation at the end of processing a request. It’s important to understand the difference between these two cases, in particular with respect to browser reloads of web pages.
- a forward is performed internally by the servlet
- the browser is completely unaware that it has taken place, so its original URL remains intact
- any browser reload of the resulting page will simple repeat the original request, with the original URL
- a redirect is a two step process, where the web application instructs the browser to fetch a second URL, which differs from the original
- a browser reload of the second URL will not repeat the original request, but will rather fetch the second URL
- redirect is marginally slower than a forward, since it requires two browser requests, not one
- objects placed in the original request scope are not available to the second request
More explicitly (in terms of common SQL operations) :
- for SELECT operations, use a forward
- for INSERT , UPDATE , or DELETE operations, use a redirect
It’s strongly recommended that forms for the input of search criteria should use GET , while forms for editing database records should use POST .
The most common symptom of not using forward/redirect properly is a warning message in a browser, asking the user if they really wish to POST their form data a second time.
This example is after the style of the WEB4J Controller class. The important methods of the Servlet API are:
import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; import hirondelle.web4j.action.Action; import hirondelle.web4j.action.ResponsePage; import hirondelle.web4j.request.RequestParser; import hirondelle.web4j.model.BadRequestException; public class RedirectForward extends HttpServlet < //..many items elided @Override public final void doGet( HttpServletRequest aRequest, HttpServletResponse aResponse ) throws ServletException, IOException < processRequest(aRequest, aResponse); >@Override public final void doPost( HttpServletRequest aRequest, HttpServletResponse aResponse ) throws ServletException, IOException < processRequest(aRequest, aResponse); >/** * Handle all HTTP GET and POST requests. */ protected void processRequest( HttpServletRequest aRequest, HttpServletResponse aResponse ) throws ServletException, IOException < RequestParser requestParser = RequestParser.getInstance(aRequest, aResponse); try < Action action = requestParser.getWebAction(); ResponsePage responsePage = action.execute(); if ( responsePage.getIsRedirect() ) < redirect(responsePage, aResponse); >else < forward(responsePage, aRequest, aResponse); >> catch (BadRequestException ex)< //..elided //use Response.sendError() > catch (Throwable ex) < //..elided //use Response.sendError() > > // PRIVATE // private void redirect( ResponsePage aDestinationPage, HttpServletResponse aResponse ) throws IOException < String urlWithSessionID = aResponse.encodeRedirectURL(aDestinationPage.toString()); aResponse.sendRedirect( urlWithSessionID ); >private void forward( ResponsePage aResponsePage, HttpServletRequest aRequest, HttpServletResponse aResponse ) throws ServletException, IOException < RequestDispatcher dispatcher = aRequest.getRequestDispatcher(aResponsePage.toString()); dispatcher.forward(aRequest, aResponse); >>
Java Practices 3.012
© 2023 John O’Hanley
Source Code | Contact | License | RSS
Individual code snippets have a BSD license
Over 1,000,000 unique IPs last year
Last updated 2023-01-03
— In Memoriam : Bill Dirani —
Русские Блоги
Разница между Forward и Redirect в Java [! ! ! важный! ! ! 】
оглавление
Пользователь отправляет HTTP-запрос на сервер. Запрос может быть обработан несколькими информационными ресурсами, прежде чем он будет возвращен пользователю. Каждый информационный ресурс использует механизм пересылки запросов для пересылки запроса друг другу, но пользователь здесь вообще не чувствует пересылку запроса. В соответствии с различными методами пересылки его можно разделить на прямую пересылку запросов (Forward) и косвенную переадресацию запросов (Redirect), так в чем же разница между этими двумя методами пересылки? Каковы принципы двух методов пересылки? В каком случае используются соответствующие методы?
обзор
Метод прямой пересылки (forward)
Клиент и браузер отправляют запрос только один раз. Сервлет, HTML, JSP или другие информационные ресурсы отвечают вторым информационным ресурсом. В запросе объекта запроса сохраненный объект совместно используется для каждого информационного ресурса.
Косвенный метод переадресации (Redirect)
На самом деле это два HTTP-запроса. Когда сервер отвечает на первый запрос, браузер отправляет запрос на другой URL-адрес для достижения цели пересылки.
Чтобы привести популярный пример:
Прямая пересылка эквивалентна: «A просит B одолжить деньги, B говорит« нет », и B переходит к C, чтобы одолжить, и сообщение будет передано A, если оно не может быть заимствовано»;
Косвенная переадресация эквивалентна: «A просит B одолжить деньги, B говорит« нет », пусть A идет к C, чтобы одолжить».
принцип
Непрямая пересылка запросов (Redirect)
Косвенная переадресация, иногда называемая перенаправлением, обычно используется для предотвращения ненормального доступа пользователя. Например, если пользователь получает доступ к фоновому ресурсу без входа в систему, сервлет может перенаправить HTTP-запрос на страницу входа, чтобы предоставить пользователю доступ после входа в систему. В сервлете, вызывая метод SendRedirect () объекта ответа, чтобы сообщить браузеру о необходимости перенаправить на указанный URL, образец кода выглядит следующим образом:
// Метод обработки запроса на получение в сервлете public void doGet(HttpServletRequest request,HttpServletResponse response)< // Запрос на перенаправление на другой ресурс response.sendRedirect («URL ресурса»); >
Процесс косвенной пересылки запроса, как показано на рисунке выше, выглядит следующим образом:
- Браузер отправляет запрос доступа на Servlet1;
- Servlet1 вызывает метод sendRedirect () для перенаправления браузера на Servlet2;
- Браузер отправляет запрос на сервлет2;
- Наконец Servlet2 отвечает.
Прямая пересылка запросов (Forward)
Метод прямой пересылки используется чаще.В общем случае, пересылка запросов относится к методу прямой пересылки. Большинство веб-приложений будет иметь контроллер. Контроллер контролирует, к какому информационному ресурсу должен быть направлен запрос. Эти информационные ресурсы затем обрабатывают запрос.После обработки они могут быть перенаправлены на другие информационные ресурсы для возврата пользователю. Этот процесс является классической моделью MVC.
Интерфейс javax.serlvet.RequestDispatcher — это интерфейс, который должен реализовывать перенаправитель запросов. Веб-контейнер предоставляет сервлету объект, который реализует интерфейс. Метод переадресации вызова () интерфейса используется для достижения цели пересылки запросов. Пример кода следующий:
// Метод обработки запроса на получение в сервлете public void doGet(HttpServletRequest request , HttpServletResponse response)< // Получить запрос повторителя объекта, точка повторителя задается параметром getRequestDisPatcher () RequestDispatcher requestDispatcher = request.getRequestDispatcher ("URL ресурса"); // вызов метода forward () для пересылки запроса requestDispatcher.forward(request,response); >
Процесс прямой пересылки запроса, показанного на рисунке выше, выглядит следующим образом:
- Браузер отправляет запрос доступа на Servlet1;
- Servlet1 вызывает метод forward () для пересылки запроса в Servlet2 на стороне сервера;
- Наконец Servlet2 отвечает.
Ежедневные навыки развития:Фактически, через браузер вы можете заметить, что сервер использует метод пересылки запросов. Когда вы нажимаете гиперссылку, адрес текущего запроса будет отображаться в адресной строке браузера. Если серверная сторона отвечает, адресная строка найдена. ‘S адрес меняется, оказывается, это косвенная переадресация запроса. Напротив, если адрес не изменился, это означает, что запрос перенаправляется напрямую или не пересылается.
Чем больше вы знаете, тем больше вы не знаете.
Поделись со всеми, я верю, что у многих людей будет одинаковое восприятие.
Нет никакого способа сделать это, но это все еще возможно, но нет никакого способа остановить это.
Если у вас есть какие-либо другие вопросы, вы можете оставить сообщение, мы обсудим вместе, учимся вместе и делаем успехи вместе
Сервлет Redirect или Forward?
Иногда первоначальный обработчик HTTP-запросов в нашем сервлете Java должен делегировать запрос другому ресурсу. В этих случаях мы можем либо перенаправить запрос дальше, либо перенаправить его на другой ресурс.
Мы будем использовать оба механизма и обсудим различия и лучшие практики каждого из них.
2. Зависимости Maven
Во-первых, давайте добавим зависимость Servlet Maven:
dependency> groupId>javax.servletgroupId> artifactId>javax.servlet-apiartifactId> version>4.0.0version> dependency>
Последнюю версию можно найти здесь .
3. Вперед
Давайте теперь перейдем прямо и посмотрим, как сделать простой форвард:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) RequestDispatcher dispatcher = getServletContext() .getRequestDispatcher("/forwarded"); dispatcher.forward(req, resp); >
Мы получаем ссылку RequestDispatcher из родительского сервлета и указываем на другой ресурс сервера.
Проще говоря, это перенаправит запрос.
Когда клиент отправляет запрос на http://localhost:8081/hello?name=Dennis , эта логика будет запущена, и запрос будет перенаправлен на « /forwarded ».
4. Перенаправление
Теперь, когда мы понимаем концепцию переадресации, давайте взглянем на быстрый фрагмент для перенаправления:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) resp.sendRedirect(req.getContextPath() + "/redirected"); >
Мы используем исходный объект ответа, чтобы перенаправить этот запрос на другой URL-адрес : « /redirected».
Когда клиент отправляет запрос на http://localhost:8081/welcome?name=Dennis , запрос будет перенаправлен на http://localhost:8081/redirected.
Чтобы узнать больше о переадресации в контексте Spring, ознакомьтесь с нашей специальной статьей здесь .
5. Отличия
Мы передали параметр « имя » со значением в обоих случаях. Проще говоря, перенаправленные запросы по-прежнему имеют это значение, а перенаправленные запросы — нет.
Это связано с тем, что при перенаправлении объект запроса отличается от исходного. Если мы все еще хотим использовать этот параметр, нам нужно сохранить его в объекте HttpSession .
Вот список основных различий между переадресацией сервлета и перенаправлением:
- Далее запрос будет обработан на стороне сервера.
- Переадресация не влияет на клиента, URL-адрес в браузере остается прежним
- Объекты запроса и ответа останутся одним и тем же объектом после переадресации. Объекты области запроса будут по-прежнему доступны
Перенаправить :
- Запрос перенаправляется на другой ресурс
- Клиент увидит изменение URL-адреса после перенаправления
- Создается новый запрос
- Перенаправление обычно используется в рамках шаблона веб-разработки Post/Redirect/Get .
6. Заключение
Переадресация и перенаправление связаны с отправкой пользователя на разные ресурсы, хотя они имеют совершенно разную семантику.
Выбрать между ними просто. Если требуется предыдущая область или пользователю не нужно информироваться, но приложение также хочет выполнить внутреннее действие, используйте пересылку .
Чтобы отказаться от области действия или если новый контент не связан с исходным запросом (например, перенаправление на страницу входа или завершение отправки формы), используйте перенаправление .
Как всегда, пример кода можно найти на GitHub .