我有一个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());
}
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);
}
}
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
给出零身体反应?如果我遗漏了某些内容或者没有正确使用,请建议。感谢。
答案 0 :(得分:0)
可能是因为您将其转换为String
,然后又转换回byte
数组。这将把它编码为可打印的,这对任意二进制数据都不起作用。
您可以尝试向toBytes()
添加ByteResponseWrapper
方法,然后只返回output.toByteArray()
:
return response.getOutputStream().write(wrappedResponse.toBytes());
显然,同一行不适用于你的CharResponseWrapper
,所以如果你需要这两行,你需要额外的逻辑来处理它们。
(同样地,为二进制数据返回PrintWriter
没有意义。Writers
用于文本。)