«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-адрес: «/перенаправлено».

Когда клиент отправляет запрос на http://localhost:8081/welcome?name=Dennis, запрос будет перенаправлен на http://localhost:8081/redirected.

Чтобы узнать больше о переадресации в контексте Spring, ознакомьтесь с нашей специальной статьей здесь.

5. Различия

В обоих случаях мы передали параметру «имя» значение. Проще говоря, перенаправленные запросы по-прежнему имеют это значение, а перенаправленные запросы — нет.

Это связано с тем, что при перенаправлении объект запроса отличается от исходного. Если мы все еще хотим использовать этот параметр, нам нужно сохранить его в объекте HttpSession.

Вот список основных различий между переадресацией и перенаправлением сервлета:

Переадресация:

    Запрос будет дополнительно обработан на стороне сервера Переадресация не влияет на клиента, URL-адрес в браузере остается прежним Объекты запроса и ответа останутся одним и тем же объектом после переадресации. Объекты области запроса будут по-прежнему доступны

Перенаправление:

    Запрос перенаправляется на другой ресурс Клиент увидит изменение URL-адреса после перенаправления Создается новый запрос Перенаправление обычно используется в Post/Redirect/Get web шаблон разработки

6. Заключение

Переадресация и перенаправление связаны с отправкой пользователя на разные ресурсы, хотя они имеют совершенно разную семантику.

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

Чтобы отменить область действия или если новое содержимое не связано с исходным запросом, например перенаправление на страницу входа или завершение отправки формы, используйте перенаправление.

Как всегда, пример кода можно найти на GitHub.