Я хочу сделать фильтр сервлета, который будет читать содержимое ответа после его обработки и завершения и вернуть эту информацию в XML или PDF или что-то еще. Но я не уверен, как получить информацию из объекта HttpServletResponse. Как я могу получить эту информацию?
Как я могу прочитать выходной поток HttpServletReponses?
Ответ 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 как такового. Возможно, имеет смысл структурировать ваше приложение таким образом, чтобы запросы были проксированы к соответствующим обработчикам и передавались с объектами передачи данных, из которых вы можете построить соответствующий окончательный ответ. Таким образом, вы никогда не модифицируете более одного объекта ответа или не должны читать из них.
Не прямой ответ, я знаю, но как бы я это сделал, вопрос.