【问题标题】:CharResponseWrapper captured content is emptyCharResponseWrapper 捕获的内容为空
【发布时间】:2016-02-24 15:35:37
【问题描述】:

我尝试了以下示例来替换我的 servlet 响应中的一些内容。

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());
        }
    }
}

如您所见,我想用correctClass 替换字符串forbiddenClass,但它只适用于html 文件。 test.css 的内容没有改变,过滤器的以下消息被打印输出。

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

为什么 test.css 的内容是空的?

【问题讨论】:

    标签: spring servlets servlet-filters


    【解决方案1】:

    为什么 test.css 的内容是空的?

    因为您只捕获了写入response.getWriter() 的任何内容,而不是写入response.getOutputStream() 的任何内容。

    您需要HttpServletResponseWrapper 实现,如相关问题的答案底部所示:Catch-all servlet filter that should capture ALL HTML input content for manipulation, works only intermittently

    【讨论】:

    • 非常感谢,这就是解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多