Вы можете использовать ServletResponseWrapper
, чтобы перехватывать записи и помещать их в свой собственный буфер для извлечения при необходимости.
Например, вы можете начать с:
public class WrappingFilter implements Filter
{
private static final ThreadLocal<StringBuilder> contentBuffer = new ThreadLocal<>();
@Override
public void init(final FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
throws IOException, ServletException
{
contentBuffer.set(new StringBuilder());
chain.doFilter(request, new ContentBufferingResponseWrapper(response));
contentBuffer.remove();
}
@Override
public void destroy()
{
}
public static StringBuilder getResponse()
{
return contentBuffer.get();
}
private class ContentBufferingResponseWrapper extends ServletResponseWrapper
{
public ContentBufferingResponseWrapper(final ServletResponse response)
{
super(response);
}
@Override
public PrintWriter getWriter() throws IOException
{
return new PrintWriter(super.getWriter())
{
@Override
public void write(final String s, final int off, final int len)
{
contentBuffer.get().append(s);
super.write(s, off, len);
}
};
}
}
}
Затем вы можете вызвать WrappingFilter.getResponse()
, чтобы получить буфер ответа, записанного к настоящему времени для текущего запроса.
Это не изящное решение, и я не проверял его, но, надеюсь, может поставить вас на правильный путь.
Я предлагаю вам взглянуть на sitemesh, который использует аналогичный подход для перехвата ответав другой буфер, чтобы его можно было изменить перед записью в ответ - немного отличается от того, что вы пытаетесь сделать, но можно применить тот же метод.https://github.com/sitemesh/sitemesh3/blob/master/sitemesh/src/main/java/org/sitemesh/webapp/contentfilter/HttpServletResponseBuffer.java