sendRedirect() отправляет HTTP ответ с кодом 302 (Found) и URL нового ресурса. Браузер клиента получает этот ответ и отправляет новый запрос на указанный URL. Это внешний переход, URL в адресной строке браузера изменяется.
forward() выполняет внутренний переход. Запрос передается от одного ресурса (сервлета или JSP) к другому на стороне сервера. Браузер клиента не знает об этом переходе, URL в адресной строке не изменяется.
Ключевые отличия:
| Характеристика | sendRedirect() | forward() |
|---|---|---|
| Тип перехода | Внешний (через браузер) | Внутренний (на сервере) |
| Изменение URL в браузере | Да | Нет |
| HTTP метод | Всегда GET для нового запроса | Сохраняется исходный метод (GET/POST) |
| Запрос | Создается новый запрос | Используется исходный запрос |
| Объекты запроса/ответа | Не сохраняются | Сохраняются |
| Возможность сохранения атрибутов | Требует передачи через параметры URL или сессию | Используются атрибуты запроса (request attributes) |
| Количество запросов/ответов | Два запроса, два ответа | Один запрос, один ответ |