Перенаправление сервлета против форварда

Перенаправление сервлета против форварда

1. обзор

Иногда первоначальный обработчик HTTP-запросов в нашем Java-сервлете должен делегировать запрос другому ресурсу. В этих случаях мы можем либо переслать запрос дальше, либо перенаправить его на другой ресурс.

Мы будем использовать оба механизма и обсудим различия и лучшие практики каждого из них.

2. Maven Зависимости

Во-первых, давайте добавим зависимость сервлета Maven:


    javax.servlet
    javax.servlet-api
    4.0.0

Последнюю версию можно найтиhere.

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");
}

We use original response object to redirect this request to another URL: «/redirected”.

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

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

5. Различия

Мы передали параметр «name» со значением в обоих случаях. Simply put, forwarded requests still carry this value, but redirected requests don’t.

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

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

Forward:

  • Запрос будет дополнительно обработан на стороне сервера

  • Пересылка не влияет на клиента, URL в браузере остается прежним

  • Объекты запроса и ответа останутся тем же объектом после пересылки. Объекты области запроса будут по-прежнему доступны

Redirect:

  • Запрос перенаправлен на другой ресурс

  • Клиент увидит изменение URL после перенаправления

  • Новый запрос создан

  • Перенаправление обычно используется в шаблоне веб-разработкиPost/Redirect/Get

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

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

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

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

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