首页 > 解决方案 > 从 HttpServletRequest 读取 InflaterInputStream 时出现 EOFException

问题描述

我有一个 API,客户端可以通过发送压缩请求向其发出请求。压缩是使用 Deflator 以下方式完成的。

请求有效载荷:

public byte[] compressRequest(String requestString) {
    int reqLength = requestString.length();
    int temp = (int)(1.001D * (double)reqLength + 1.0D) + 12;
    byte[] byteArr = requestString.getBytes("US-ASCII");
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(temp);
    DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream);
    deflaterOutputStream.write(byteArr);
    deflaterOutputStream.close();
    return byteArrayOutputStream.toByteArray();
}

在服务器端,我正在尝试按照以下方式提取和解压缩数据。

相同的代码在基于 Java7 和 Servlet 的应用程序上运行良好。但是在基于 java 8 和 Spring boot 的应用程序中,我java.io.EOFException: Unexpected end of ZLIB input stream在行出现以下异常inputLine = in.readLine())

@PostMapping(value = "saverecord")
public void hello(HttpServletRequest request, HttpServletResponse response) {
    response.setContentType("application/binary");
    InflaterInputStream is = InflaterInputStream(request.getInputStream());
    String requestXMLStr = extract(is, 0);
    ServletOutputStream out = response
                .getOutputStream();

    // some processing and return response
}

private String extract(InputStream is) throws IOException {
    StringBuffer sb = new StringBuffer();
    BufferedReader in = new BufferedReader(new InputStreamReader(is));
    String inputLine;
    while ((inputLine = in.readLine()) != null) {
        sb.append(inputLine);
    }
    return sb.toString();
}

我尝试遵循其他 SO 答案中建议的两件事,但都没有奏效。

InflaterInputStream is = InflaterInputStream(request.getInputStream(), new Inflater(false)); // tried true also

尝试设置编码

BufferedReader in = new BufferedReader(new InputStreamReader(is, "US-ASCII"));

PS:由于某些项目特定的原因,我不能@RequestBody在项目中使用。

标签: javaspring-boottomcatservlets

解决方案


推荐阅读