Почему нельзя обновить заголовки HttpServletResponse ПОСЛЕ вызова getWriter ()? - PullRequest
8 голосов
/ 01 марта 2012

Я копался в Интернете после того, как решил проблему сегодня днем ​​@ work, где файлы cookie, добавленные в HttpServletResponse, не отражались должным образом в заголовках ответа, поскольку наш сервлет уже получил PrintWriter ответа (т.е. response.getWriter)) прежде чем мы добавили куки.Теперь я знаю, что лучшие практики требуют, чтобы изменения заголовка ответа (т.е. установка типа контента, добавление / редактирование файлов cookie и т. Д.) Выполнялись до вызова getWriter (), но я ищу следующее: почему?

Мы размышляли о том, почему получение PrintWriter фактически замораживает заголовки ответа, но почему в спецификации Servlet это обязательно применяется?

Ответы [ 2 ]

13 голосов
/ 01 марта 2012

Раздел SRV.5.2 Заголовки Спецификация сервлета Java ™ Версия 2.4

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

Таким образом, в спецификации явно не упоминается getWriter(), влияющий на установку заголовков.

Однако,ваша реализация сервлет-контейнера, возможно, решила обработать ответ как завершенный после вызова getWriter().Это немного отличается.

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

Это всегда стоитвызов getWriter() как можно позже, так как вам может потребоваться возможность установить кодировку символов и т. д., которые должны быть установлены до вызова getWriter().

3 голосов
/ 01 марта 2012

Поскольку заголовки предшествуют телу в HTTP. Вот почему их называют «заголовки». Если вы вызываете getWriter (), вы пишете в тело, поэтому потом уже слишком поздно начинать изменять значения заголовка ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...