Предотвращение IllegalStateException в веб-стеке Java / сервлетов - PullRequest
0 голосов
/ 02 апреля 2009

Не знаю, но я чувствую, что IllegalStateException вызывает головную боль отмены. Если у меня есть запрос, скажите JSP или какой-нибудь другой сервлет, и мне нужно связать фильтр с этим запросом. Я не могу внести какие-либо другие изменения в вывод для клиента, если ответ уже был принят?

Например, я вижу в коде JSP, который устанавливает mimetype для response.setContent ("html"), а затем у меня есть фильтр, связанный с JSP, который должен установить mimetype на что-то остальное. setContent ("изображение") или "xhtml". Но я получаю IllegalStateException?

Есть ли способ очистить предыдущий ответ, который был зафиксирован, или есть что-то, чтобы избежать этой проблемы.

Это на веб-сфере.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2009

Я думаю, вам нужно переосмыслить то, как вы готовите и возвращаете свои ответы. Вы не можете написать в ответ (который может написать клиенту), а затем передумать.

Оставляя в стороне вопрос о том, почему ваше решение должно изменить тип возвращаемого значения, я бы написал в некоторый фиктивный контейнерный объект с типом возврата + тип и сделал бы это изменчивым. Только после того, как ваш сервлет завершит всю свою работу, вы сможете записать этот объект (тип + содержимое) в выходной поток.

(для пояснения, я не думаю, что фильтры сервлетов являются правильным подходом для этого. Они будут перехватывать запрос и ответ, но заполнение ответов является обязанностью сервлета)

1 голос
/ 02 апреля 2009

Я согласен с другими авторами, что это ужасно, но вы можете создать HttpServletResponseWrapper в вашем фильтре, который бы перехватывал выходные данные и передавал эту обертку в цепочку вместо исходного объекта ответа.

0 голосов
/ 02 апреля 2009

Ваша предпосылка выполнить jsp, выводящий HTML, а затем иметь фильтр, изменяющий тип контента на что-то другое, например изображение, в том же ответе, не имеет смысла. Ответ может вернуть только один артефакт, будь то файл HTML или изображение. Невозможно вернуть оба ответа в одном ответе - любая попытка сделать это - бессмыслица. Нет смысла отправлять HTML-код с прикрепленным двоичным изображением на конце. Тип контента для всего ответа. Вы не можете упаковать несколько вещей в одном ответе.

Иногда вы можете выполнить resetBuffer (), если выходные данные не превышают размер буфера. Наилучший подход состоит в том, чтобы избежать этой возможности и определить, что делать, прежде чем начать вывод ответа.

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