Подтвердить что ты не робот

Как я могу прочитать выходной поток HttpServletReponses?

Я хочу сделать фильтр сервлета, который будет читать содержимое ответа после его обработки и завершения и вернуть эту информацию в XML или PDF или что-то еще. Но я не уверен, как получить информацию из объекта HttpServletResponse. Как я могу получить эту информацию?

4b9b3361

Ответ 1

Добавьте это в файл java фильтра.

static class MyHttpServletResponseWrapper 
  extends HttpServletResponseWrapper {

  private StringWriter sw = new StringWriter(BUFFER_SIZE);

  public MyHttpServletResponseWrapper(HttpServletResponse response) {
    super(response);
  }

  public PrintWriter getWriter() throws IOException {
    return new PrintWriter(sw);
  }

  public ServletOutputStream getOutputStream() throws IOException {
    throw new UnsupportedOperationException();
  }

  public String toString() {
    return sw.toString();
  }
}

Используйте следующий код:

HttpServletResponse httpResponse = (HttpServletResponse) response;
MyHttpServletResponseWrapper wrapper = 
  new MyHttpServletResponseWrapper(httpResponse);

chain.doFilter(request, wrapper);

String content = wrapper.toString();

Теперь в переменной содержимого есть выходной поток. Вы также можете сделать это для двоичного содержимого.

Ответ 2

Spring теперь имеет функцию для него. Все, что вам нужно сделать, это использовать [ContentCachingResponseWrapper], который имеет метод public byte [] getContentAsByteArray().

Я предлагаю сделать WrapperFactory, который позволит настроить его, использовать ли ResponseWrapper по умолчанию или ContentCachingResponseWrapper.

Ответ 3

Я не верю, что вы можете сделать это, учитывая, что запись в выходной поток может привести к тому, что данные будут сброшены клиенту до того, как любые фильтры сервлетов будут вызваны по-населению. Как предполагает iftrue, потребуется другая архитектура, чтобы генерировать ваш XML (скажем), а затем регенерировать в любом желаемом формате.

РЕДАКТИРОВАТЬ: прочитав свой ответ на публикацию iftrue, если вы действительно не можете вмешиваться в текущую обработку, возможно, вам нужен сервлет, чтобы проксировать ваш запрос, захватить вывод из исходного вывода и затем, при необходимости, сделать munge. Очень противно, однако: - (

Ответ 4

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

Не прямой ответ, я знаю, но как бы я это сделал, вопрос.