Фильтр сервлетов для кэширования

Я создаю фильтр сервлета для кэширования. Идея состоит в том, чтобы кэшировать тело ответа в memcached. Тело ответа генерируется (результатом является строка):

 response.getWriter().print(result);

Мой вопрос заключается в том, что, поскольку тело ответа будет помещено в memcached без изменений, мне все еще нужно создать настраиваемый HttpServletResponseWrapper? Может ли кто-нибудь предоставить код скелета для этого фильтра?


person dolphincody    schedule 26.04.2011    source источник


Ответы (1)


Вы должны иметь возможность захватывать выходные данные сервлета в своем фильтре.

Для этого вам нужно внедрить настроенный HttpServletResponseWrapper, который собирает все выходные данные, отправленные куда-то getWriter().print(), чтобы вы могли передать их в memcached.

Может быть, что-то вроде:

  ByteArrayOutputStream baos = new ByteArrayOutputStream(3000); 
  final PrintWriter w = new PrintWriter(new OutputStreamWriter(baos, "UTF-8"));

  HttpServletResponse wrapper = new HttpServletResponseWrapper(response) {

                        @Override
                        public PrintWriter getWriter() throws IOException {
                            return w;
                        }

                    };

Если это более крупный проект и у вас есть больший контроль над сетевой инфраструктурой, также может быть хорошей идеей не делать этого в Java, а просто использовать отдельный прокси-сервер перед контейнером Servlet. Вы можете управлять тем, что должно кэшироваться, с помощью обычных заголовков управления кешем (которые вы можете установить с помощью фильтра, если сервлет еще этого не делает).

person Thilo    schedule 26.04.2011
comment
Спасибо, значит ли это, что HttpServletResponseWrapper является обязательным, даже если тело ответа не будет изменено? - person dolphincody; 26.04.2011
comment
Как еще вы собираетесь получить вывод сервлета? Если вы ничего не сделаете, он будет писать прямо в сетевое подключение в браузер, и ваш фильтр ничего этого не увидит. - person Thilo; 26.04.2011
comment
Спасибо, а как мне тогда получить тело ответа из оболочки? - person dolphincody; 26.04.2011
comment
Он помещает ответ в baos ByteArrayOutputStream, поэтому вы можете вызвать baos.getBytes(). - person Thilo; 26.04.2011