Можно ли перенаправить запрос после пересылки? - PullRequest
4 голосов
/ 22 мая 2011

В некоторых случаях я хочу принудительно выйти из системы. Я использую Spring Security, и единственный способ, которым я знаю, как это сделать, это переадресация / перенаправление на / выход из системы (или любой другой URL, который Spring прослушивает при попытках выхода из системы). Поскольку теоретически пользователь может запретить своему браузеру выполнять перенаправление, я бы предпочел переадресовать URL-адрес выхода из системы, поскольку очень важно, чтобы логика выхода выполнялась. Поскольку Spring всегда выполняет перенаправление после (не) успешного выхода из системы, мне интересно, будет ли это проблемой. Итак, короче говоря, разрешено ли перенаправление после того, как запрос уже перенаправлен, или это приведет к исключению IllegalStateException?

Ответы [ 2 ]

6 голосов
/ 22 мая 2011

Короче говоря, разрешено ли перенаправление после того, как запрос уже был переадресован, или это приведет к исключению IllegalStateException?

Нет, это абсолютно нормально.Сам ответ не знает о пересылке - он происходит исключительно внутри сервера.Пересылка - это просто механизм для внутренней передачи управления от одного серверного компонента другому.

В отличие от этого, вы, как правило, не можете пересылать после перенаправления, поскольку перенаправление «фиксирует» ответ, и отмена этого не происходит.

4 голосов
/ 23 мая 2011

Вы получите IllegalStateException только тогда, когда ответ будет зафиксирован.Таким образом, если перенаправленный ресурс фиксирует ответ перед перенаправлением, вы получите IllegalStateException.Ответ фиксируется, когда заголовки ответа уже отправлены.Это может произойти, когда вы записываете байт в тело ответа и очищаете его.Для перенаправления требуется незафиксированный ответ, потому что для перенаправления необходимо задать заголовок Location с пустым телом.

В подходящем подходе MVC JSP является частью ответа, поэтому всякий раз, когда вы отправляетеперенаправьте изнутри JSP либо скриптлет , либо JSTL <c:redirect>, тогда вы рискуете IllegalStateException.Но если вы нигде этого не делаете, вам не о чем беспокоиться.

...