1. Обзор
Иногда первоначальный обработчик HTTP-запросов в нашем сервлете Java должен делегировать запрос другому ресурсу. В этих случаях мы можем либо перенаправить запрос дальше, либо перенаправить его на другой ресурс.
Мы будем использовать оба механизма и обсудим различия и лучшие практики каждого из них.
2. Зависимости Maven
Во-первых, давайте добавим зависимость Servlet Maven:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
</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 .