2016-05-13 1 views
1

У меня есть служба RESTful, разработанная Java Spring. Я создал несколько фильтров для аутентификации, получить некоторые пользовательские заголовки и т. Д. И т. Д. В одном из фильтров мне нужно регистрировать входящий запрос и исходящий ответ. Прямо сейчас я застрял в регистрации ответа. здесь фильтрполучить строку содержимого сервлетаResponse для ведения журнала

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException 

servletResponse является объект, мне нужно, чтобы получить содержание.

Я знаю, что есть несколько повторяющихся вопросов, которые уже ответили, но почему-то никто из них не работает для меня.

У меня есть filter и в doFilter метод после chain.doFilter Я хочу зарегистрировать содержание ответа.

Я могу видеть объект JSON, когда я осматриваю response в outputStream или в writer. Но я не могу получить это программно.

Может кто-нибудь помочь мне решить эту проблему? Заранее спасибо!

Вот ссылки, которые я использовал и не помогло:

How to read and copy the HTTP servlet response output stream content for logging

Capture and log the response body

Logging response body (HTML) from HttpServletResponse using Spring MVC HandlerInterceptorAdapter

+0

ли вы попробовать что-то уже? У вас есть код? – ib11

+0

Я отредактирую свой вопрос и включу все коды, которые я пробовал и не помог – Armen

+0

Как именно первая ссылка не помогла? – BalusC

ответ

1

Для пользовательского решения здесь является идея.

В фильтре необходимо обернуть ответ и перехватить вывод сервлета, чтобы вы могли его написать.

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) throws ServletException, IOException { 

    // Wrap the response 
    MyResponseWrapper responseWrapper = 
         new MyResponseWrapper((HttpServletResponse) response); 

    chain.doFilter(request, responseWrapper); 
} 

Где MyResponseWrapper класс, где можно перехватить все вызовы в выходной поток

public class MyResponseWrapper implements HttpServletResponse { 
    private HttpServletResponse response; 
    private ServletOutputStream outputStream; 
    private MyOutputStreamCopier myOutputStreamCopier; 

    public MyResponseWrapper(HttpServletResponse response) { 
     this.response = response; 
    } 

    // Implements all needed methods 

    // Write methods like the following to redirect output to your logs 
    public ServletOutputStream getOutputStream() throws IOException { 
     if (outputStream == null) { 
      outputStream = getResponse().getOutputStream(); 
      copier = new MyOutputStreamCopier(outputStream); 
     } 

     return copier; 
    } 
} 

Где MyOutputStreamCopier это пользовательский класс, который расширяет ServletOutputStream и скопировать все записи в локальный буфер (или непосредственно зарегистрировать ее в файл журнала).


Если вы, как уже строить принять решение взглянуть на эту link

+0

Лоренцо, как я могу получить контент после doFilter? – Armen

+0

@Armen в основном MyOutputStreamCopier должен буферизовать данные, отправленные на выход, поэтому вы можете использовать их в другой момент. Вероятно, вы можете добавить метод String getOutputContent() для извлечения содержимого в виде строки. В противном случае вы можете напрямую писать в файл журнала в классе MyOutputStreamCopier. –

Смежные вопросы