Java-更改来自筛选器的Servlet响应

Java-更改来自筛选器的Servlet响应,java,filter,response,Java,Filter,Response,我试图将某个字符串附加到发送回客户端的每个响应中。 为此,我使用一个如下所示的过滤器: public class OutFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {

我试图将某个字符串附加到发送回客户端的每个响应中。 为此,我使用一个如下所示的过滤器:

public class OutFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain filterChain) throws IOException, ServletException {
        PrintWriter out = resp.getWriter();
        CharResponseWrapper wrapper = new CharResponseWrapper(
        (HttpServletResponse) resp);

        filterChain.doFilter(request, wrapper);

        out.print(wrapper.toString());
        out.print("ADDITIONAL CONTENT".toString());
    }
}
我知道在doFilter()方法通过后无法更改ServletResponse对象,因此我使用HTTP响应的包装器:

public class CharResponseWrapper extends HttpServletResponseWrapper {

    private CharArrayWriter output;
    private ServletOutputStream stream;

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

    public CharResponseWrapper(HttpServletResponse response) throws IOException {
        super(response);
        output = new CharArrayWriter();
        stream = new ServletOutputStream() {

            @Override
            public void write(int b) throws IOException {
                // TODO Auto-generated method stub

            }
        };
    }

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

    public ServletOutputStream getOutputStream() {
        return stream;
    }

}
My web.xml如下所示:

<filter>
    <filter-name>OutFilter</filter-name>
    <filter-class>com.foo.OutFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>OutFilter</filter-name>
    <url-pattern>/1.html</url-pattern>
    <url-pattern>/2.html</url-pattern>
    <url-pattern>/3.html</url-pattern>
    <url-pattern>/statistics</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
public class Statistics extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        resp.getWriter().print("<b>Hello, World</b>");

    }
}
我做错了什么


谢谢您的帮助。

我不明白您的过滤器是如何工作的。它用一个假作者替换了作者,但对写给假作者的内容不做任何处理。而且它不会取代输出流。谢谢,我已经更新了我的过滤器。但是我仍然遇到同样的问题——没有任何东西附加到静态文件中,只附加到servlet中。您仍然没有覆盖包装器中的OutputStream。默认servlet可能直接将字节写入响应输出流,而不使用假编写器。重写getOutputStream(),在过滤器和包装器中添加调试断点,然后查看调用的内容。我再次更新了我的帖子。我的过滤器现在使用自己的OutputStream。然而,我仍然有一些静态文件的问题。谢谢你的帮助!
java.lang.IllegalStateException: NO CONTENT