2016-02-24 2 views
1

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

Programming Customized Requests and Responses

test.html

<!DOCTYPE html> 
<html lang="en" xmlns:th="http://www.thymeleaf.org"> 
<head> 
    <meta charset="UTF-8"></meta> 
    <link th:href="@{/css/test.css}" rel="stylesheet"></link> 
    <title>Test</title> 
</head> 
<body> 
    <p class="forbiddenClass">Test!</p> 
</body> 
</html> 

test.css:

.forbiddenClass { 
    color: red; 
} 

CharResponseWrapper.java

public class CharResponseWrapper extends HttpServletResponseWrapper { 

    private final CharArrayWriter output; 

    public CharResponseWrapper(final HttpServletResponse response) { 
     super(response); 
     output = new CharArrayWriter(); 
    } 

    public String toString() { 
     return output.toString(); 
    } 

    public PrintWriter getWriter() { 
     return new PrintWriter(output); 
    } 
} 

ClassReplacementFilter.java

@Component 
public class ClassReplacementFilter extends GenericFilterBean { 

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

     final CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response); 
     chain.doFilter(request, wrapper); 

     String content = wrapper.toString(); 
     if (StringUtils.isEmpty(content)) { 
      System.out.println("content is empty for content type: " + response.getContentType()); 
     } else { 
      content = content.replaceAll("forbiddenClass", "correctClass"); 
      response.setContentLength(content.getBytes().length); 
      response.getOutputStream().write(content.getBytes()); 
     } 
    } 
} 

Как вы можете видеть, я хочу, чтобы заменить строку forbiddenClass с correctClass, но он работает только для HTML-файла. Содержимое test.css не изменяется, и на выход выводится следующее сообщение фильтра.

content is empty for content type: text/css;charset=UTF-8 

Почему содержание пусто test.css?

ответ

0

Почему содержимое пустое для test.css?

Потому что вы только захватили все, что написано в response.getWriter(), а не то, что написано в response.getOutputStream().

Вам необходимо выполнить HttpServletResponseWrapper, как показано внизу этого ответа на вопрос: Catch-all servlet filter that should capture ALL HTML input content for manipulation, works only intermittently.

+0

Большое спасибо, это решение. –

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

  • Нет связанных вопросов^_^