HttpServletResponseWrapper.toString()在过滤器中不返回任何内容

时间:2014-11-24 09:49:31

标签: java servlets filter

我的目标:将任何文字注入回复中。

我的尝试:在各个小项目中,我成功实施了一个改变响应的过滤器。

我的方法:您可以在我的问题底部找到所有代码! 我面临的问题是HttpServletResponseWrapper.toString()正在返回""当我把我的代码放到庞大的Web应用程序时(我的项目有很多过滤器,安全性,spring和struts框架在一起,jsp和FTL视图)。当在简单项目上使用时,HttpServletResponseWrapper.getStatus()返回304.但是当在我的大应用程序上使用时,返回的状态是 200 (表示请求正常成功)。最后发生的事情是对浏览器的未更改响应。

如果我从你那里得到任何关于这个问题的建议,我将不胜感激。提前致谢。以下是我正在使用的代码:

LogFilter.java

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class LogFilter implements Filter  {
    public void  init(FilterConfig config) 
            throws ServletException{

    }
    public void  doFilter(ServletRequest request, 
            ServletResponse response,
            FilterChain chain) 
                    throws java.io.IOException, ServletException {


        System.out.println("BEFORE filter");

        ServletOutputStream out = response.getOutputStream();

        CharResponseWrapper responseWrapper = new CharResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, responseWrapper);

        System.out.println("status : "+responseWrapper.getStatus());
        String servletResponse = new String(responseWrapper.toString());

        out.write((servletResponse + " filtered all data without any issues <B>Hahaha :)</B>").getBytes()); // Here you can change the response


        System.out.println("AFTER filter, original response: "
                + servletResponse.toString());


    }
    public void destroy() {
    }
}

CharResponseWrapper.java

import java.io.CharArrayWriter;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class CharResponseWrapper extends HttpServletResponseWrapper {
    private CharArrayWriter output;

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

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

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

的web.xml

.
.
.
.
    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>com.<<hidden>>.web.LogFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LogFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
.
.
.

1 个答案:

答案 0 :(得分:0)

非常感谢@JBNizet。你是对的,我必须覆盖我错过实现的getOutputStream。经过更多搜索,我在check answers得到了一个例子。它现在正在运作。我正在结束我的问题!