我有一个 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);
}
}
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
给出零主体响应吗?如果我遗漏了什么或做得不正确,请提出建议。谢谢。
最佳答案
这可能是因为您将其转换为 String
然后又转换回 byte
数组。这会将其编码为可打印,这不适用于任意二进制数据。
您可以尝试向 ByteResponseWrapper
添加一个 toBytes()
方法,该方法仅返回 output.toByteArray()
,然后:
return response.getOutputStream().write(wrappedResponse.toBytes());
显然,同一行代码不适用于您的 CharResponseWrapper
,因此如果您需要两者,则需要额外的逻辑来以不同的方式处理它们。
(同样,为二进制数据返回 PrintWriter
没有意义。Writers
用于文本。)
关于java - 为什么在以下代码中 Filter Servlet 中捕获二进制数据失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21776742/