как получить текст ответа в методе execute класса DispatchAction - PullRequest
0 голосов
/ 12 июня 2018

Я расширил DispatchAction, чтобы создать свой собственный класс CustomDispatch с переопределенным методом execute().

Я хочу каким-то образом получить текст ответа, который записывается в response.getWriter() одним из методов, определенных в Action.Я могу получить доступ только к объекту HttpServletResponse, а не к тексту, который был записан в ответ.

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 21 июля 2018

Вы можете использовать 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

...