Фильтры сервлетов — проблемы с манипулированием данными ответа JSP

Я создаю веб-приложение, которое должно измерять httprequests/время ответа, а также размер ответа. для этой задачи я использовал: http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/ фильтр, который делает все, что мне нужно, только сбрасывает данные запросов/ответов вместо того, чтобы печатать размер ответа. Он отлично работает с сервлетами, но, похоже, проблема с JSP... когда я пытаюсь загрузить JSP в браузере, он отображает пустую страницу, а фильтр повторяет, что размер ответа равен 0 .

Опять же, он работает безупречно, когда запрошенная страница является сервлетом... есть идеи, что может вызвать эту проблему?

ОБНОВЛЕНИЕ: я пытался найти любой фильтр, который упаковывает ответ сервлета, а затем может пересылать ответ обратно клиенту (даже как есть!), но безуспешно, если кто-нибудь может указать мне к рабочему примеру, не имеет значения, что делает оболочка, просто простая оболочка, которая что-то делает с содержимым ответа и пересылает его обратно клиенту после изменения, я буду более чем благодарен.

P.S

Я использую Apache Tomcat 7


person Mikey S.    schedule 12.10.2011    source источник


Ответы (1)


Сбросить модуль записи и поток после doFilter():

filterChain.doFilter(req, wrappedResp);
pw.getWriter().flush();
pw.getStream().flush();

Обратите внимание, что связанные коды не выдают IllegalStateException, когда:

  • вы вызываете getOutputStream() и для этого ответа был вызван метод getWriter

or

  • вы вызываете getWriter() и метод getOutputStream уже был вызван для этого объекта ответа.

Также проверьте исходный код javamelody. Их коды выглядят более надежными.


PrintWriter использует внутренний BufferedReader, и ему требуется флеш. Это было просто быстрое решение, так что, возможно, getStream().flush() на самом деле не требуется. Обратите внимание, я позвонил pw.get*().flush(), а не response.get*().flush(). Но это все еще просто быстрый ответ на конкретную проблему, когда JSP не отображаются. Если вам нужно решение производственного уровня, проверьте источник javamelody. Они, вероятно, обрабатывают гораздо больше угловых случаев (например, упомянутый IllegalStateException), чем упомянутая статья. Я бы начал с источника javamelody и вырезал ненужные функции.

person palacsint    schedule 12.10.2011
comment
Оно работает!!! Большое спасибо, не могли бы вы объяснить в нескольких словах, почему функция flush() сработала? - person Mikey S.; 12.10.2011
comment
А также, если вы говорите, что getOutputStream() должен генерировать исключение IllegalStateException, когда getWriter() уже был вызван, я не могу вызвать flush для обоих, не так ли? - person Mikey S.; 12.10.2011