在我们的例子中,我们想获取原始的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
,而它可能在您的应用程序中从未调用过。