问题描述
在我们的例子中,我们想要获取原始的POST正文并同时使用request.getParameter()。 但是,如果调用request.getParameter(),我们将无法读取原始内容。
我找到了针对servlet 2.x的解决方案, 。
但是对于Servlet 3.x,更改了ServletInputStream API。 ServletInputStream现在具有抽象isReady(),isFinished()和setReadListener()来处理必须实现的非阻塞IO。 有什么想法要在Servlet 3.x中进行吗?
对于tomcat 7,似乎在解析参数时没有调用getInputStream。
1楼
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
,在您的应用程序中可能永远不会调用它。