在我们的例子中,我们想获取原始的POST正文并同时使用request.getParameter()。但是,如果调用request.getParameter(),我们将无法读取原始正文。

我找到了servlet 2.x Http Servlet request lose params from POST body after read it once的解决方案。

但是对于Servlet 3.x,更改了ServletInputStream API。 ServletInputStream现在具有抽象isReady(),isFinished()和setReadListener()来处理必须实现的非阻塞IO。有什么想法要在Servlet 3.x中进行吗?

对于tomcat 7,似乎在解析参数时没有调用getInputStream。

最佳答案

ServletInputStream中的新Servlet 3.1方法可以按以下方式实现,扩展了链接的解决方案:

public class CachedServletInputStream extends ServletInputStream {
    private ByteArrayInputStream input;

    public CachedServletInputStream(byte[] cached) {
      /* create a new input stream from the cached request body */
      input = new ByteArrayInputStream(cached);
    }

    public int read() throws IOException {
        return input.read();
    }

    public boolean isFinished() {
        return input.available() == 0;
    }

    public boolean isReady() {
        return true;
    }

    public void setReadListener(ReadListener listener) {
        listener.onAllDataRead();
    }
}


不确定ReadListener是否还需要回调到onDataAvailable()。或者,您也可以从该方法中抛出一个UnsupportedOperationException,而它可能在您的应用程序中从未调用过。

09-19 10:04