Как написать фильтр ответов? - PullRequest
1 голос
/ 12 апреля 2011

Есть ли способ обработки только ответа в фильтре.

Правильно ли написан код, приведенный ниже?

  public void doFilter(request , response , chain) {
        //code to handle request 
          chain.doFilter(request, response);
        //code to handle response .
  }

Ответы [ 5 ]

13 голосов
/ 12 апреля 2011

Это зависит от того, что вы хотите.В целом, ваш образец не является правильным, хотя.После возвращения chain.doFilter уже слишком поздно что-либо делать с ответом.На этом этапе весь ответ уже был отправлен клиенту, и ваш код не имеет к нему доступа.

Что вам нужно сделать, это обернуть request и / или response в ваши собственные классы, передатьэти обертки в методе doFilter и обрабатывают любую обработку в ваших обертках.

Для упрощения, уже есть обертки, доступные в сервлете api: см. HttpServletRequestWrapper и HttpServletResponseWrapper классы.Если вы хотите обработать выходные данные, которые фактически отправляются клиенту, вам также нужно написать собственные оболочки OutputStream или Writer и вернуть их из вашей оболочки HttpServletResponse.Да, много переносов:)

Некоторые более простые фильтры могут работать без переноса запроса или ответа: например, перед вызовом doFilter, вы уже можете получить доступ к заголовкам запроса или вы можете отправить пользовательский ответ без вызова doFilter.Но если вы хотите обработать тело запроса, вы не можете просто прочитать его, иначе оно не будет доступно для остальной части цепочки.В этом случае вам нужно снова использовать технику упаковки.

2 голосов
/ 12 апреля 2011

Код, который вы показываете, не совсем корректен, но с необходимым упрощением терминологии - это так. Вы можете «обработать» запрос даже после chain.doFilter(..) (и ответа до него).

Что означает chain.doFilter(..), так это то, что процесс передается к желаемой цели, и когда метод возвращается, цель завершила вывод.

Так что если быть более точным - это «до» и «после», запрос был обработан и сгенерирован ответ.

0 голосов
/ 12 июня 2018

Я отфильтровал ответ, используя приведенный ниже код:

public void doFilter(request , response , chain) {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            CharResponseWrapper responseWrapper = new CharResponseWrapper(httpServletResponse);
            ServletResponse newResponse = response;
            if (request instanceof HttpServletRequest) {
              newResponse = new CharResponseWrapper((HttpServletResponse) response);
            }
            chain.doFilter(request, newResponse);
            if (newResponse instanceof CharResponseWrapper) {
                String responseString = newResponse.toString();
                if(StringUtils.isNotBlank(walletResponseString)) {
                    //code to handle response by converting to object
                }
            }
}
0 голосов
/ 09 июня 2014

Запросы и ответы доступны только для чтения. Так как у них нет методов установки для изменения содержимого этого. Но с помощью классов «HttpServletRequestWrapper и HttpServletResponseWrapper», которые предоставляются встроенными в Java, мы можем изменять его содержимое. объекты запроса и ответа от объектов-оболочек, изменяя объекты-оболочки, мы действительно можем изменить исходные объекты запросов и ответов.

0 голосов
/ 12 апреля 2011

Ваш код, кажется, в порядке.

Если вы хотите обработать только ответ, вы можете просто поместить свой код в раздел //Code to handle response . и делать все что угодно.

Если вы хотите что-то сделать с выводом, вам нужно будет предоставить специальную оболочку ответа, которая обрабатывает выходной поток в ответе, куда сервлет (и другие фильтры) могут писать в.

...