为什么在Filter Servlet中捕获二进制数据在以下代码中失败?

时间:2014-02-14 10:25:42

标签: java java-ee servlets servlet-filters binary-data

我有一个java servlet应用程序,我想捕获响应主体,然后进行一些处理。我正在使用servlet过滤器来捕获响应。我面临的问题是我不知道如何捕获二进制响应(抱歉,我是servlet和所有人的新手)。以下是实施:

过滤代码

public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException 
{
    HttpServletRequest request =  (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse)res;
    //If I change CharResponseWrapper by ByteResponseWrapper then I get 0 length content
    CharResponseWrapper wrappedResponse = new CharResponseWrapper((HttpServletResponse)response);
    if ( null != filterChain){
        filterChain.doFilter(request, wrappedResponse);
    }
    response.getOutputStream().write(wrappedResponse.toString().getBytes());
} 

ByteResponseWrapper

import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;

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

public class ByteResponseWrapper extends HttpServletResponseWrapper
{
    private ByteArrayOutputStream output;
    public ByteResponseWrapper(HttpServletResponse response) {
        super(response);
        output = new ByteArrayOutputStream();
    }
    public String toString() {
        System.out.println(output.size());
        return new String(output.toByteArray());
    }
    public PrintWriter getWriter() {
        return new PrintWriter(output);
    }
}

CharResponseWrapper

import javax.servlet.http.*;
import java.io.*;

public class CharResponseWrapper extends HttpServletResponseWrapper {
    private StringWriter output;
    public CharResponseWrapper(HttpServletResponse response) {
        super(response);
        output = new StringWriter();
    }
    public String toString() {
        return output.toString();
    }
    public PrintWriter getWriter() {
        return new PrintWriter(output);
    }
}

任何想法为什么使用ByteResponseWrapper给出零身体反应?如果我遗漏了某些内容或者没有正确使用,请建议。感谢。

1 个答案:

答案 0 :(得分:0)

可能是因为您将其转换为String,然后又转换回byte数组。这将把它编码为可打印的,这对任意二进制数据都不起作用。

您可以尝试向toBytes()添加ByteResponseWrapper方法,然后只返回output.toByteArray()

return response.getOutputStream().write(wrappedResponse.toBytes());

显然,同一行不适用于你的CharResponseWrapper,所以如果你需要这两行,你需要额外的逻辑来处理它们。

(同样地,为二进制数据返回PrintWriter没有意义。Writers用于文本。)