2015-12-23 4 views
1

Я пытаюсь воспроизвести this exampleЗаменить тело ответа с помощью фильтра

Я код:

public void doFilter(ServletRequest request, 
          ServletResponse response, 
          FilterChain chain) 
      throws java.io.IOException, ServletException { 
    HtmlResponseWrapper capturingResponseWrapper = new HtmlResponseWrapper(
      (HttpServletResponse) response); 
    // Pass request back down the filter chain 

    chain.doFilter(request,response); 
    if (response.getContentType() != null 
      && response.getContentType().contains("text/html")) { 

     String content = capturingResponseWrapper.getCaptureAsString(); 

     // replace stuff here 
     String replacedContent = content.replaceAll(
       "<h2[^>]*>(.*?)</h2>", 
       "<h3>$1 - HTML replaced</h3>"); 

     System.out.println(replacedContent); 

     response.getWriter().write(replacedContent); 

    } 

Выполнение этого кода, перейдя на HTML-страницу Я получаю ошибку 500:

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

ли Я что-то неправильно использую? Если я избавлюсь от chain.doFilter(request,response); Я не получаю никаких исключений, но получаю пустое тело ответа.

+1

Проходите оригинальный ответ на doFilter() метод, вы должны пройти responsewrapper, который ничего к OutputStream не писать. Слишком поздно, когда управление возвращается обратно в фильтр, если исходный ответ был передан. http://stackoverflow.com/a/14736818/185565 – Whome

ответ

0

Вы должны пройти обертку для doFilter метода:

chain.doFilter(request,capturingResponseWrapper); 
Смежные вопросы