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

标签 java jakarta-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());
} 

字节响应包装器

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/

相关文章:

java - 实例变量的构造函数/自引用

java - 繁琐的结帐(使用 Spring 的解决方案)

spring - java ee中的mvc模式并从spring迁移到java ee 7

azure - sql azure 连接池配置和设置

http - 使用 Akka 处理 SOAP 消息

java - doGet servlet 中的 InputStreamReader

java - 迁移房间数据库时无法添加索引

web-applications - 如何在Web应用程序中实现REST?

java - 如何使用 Apache Commons FileUpload 一次上传多个文件?

java - 可能是二进制但通常是文本的数据的高效 JSON 编码