我在这里查看sitebricks 中 HiddenMethodFilter 的实现:
在第 65 行有以下代码:
try {
    String methodName = httpRequest.getParameter(this.hiddenFieldName);
    if ("POST".equalsIgnoreCase(httpRequest.getMethod()) && !Strings.empty(methodName)) {
    ....
它检查是否设置了特定参数并使用它来包装请求。但是,在读取该参数时,它将消耗流并且最终的 servlet 将无法读取任何数据。
避免这种情况的最佳方法是什么?我在这里实现了 HttpServletRequestWrapper ,它将流的内容读入字节数组。然而,这可能会使用大量内存来存储请求。
private HttpServletRequestWrapper getWrappedRequest(HttpServletRequest httpRequest, final byte[] reqBytes)
   throws IOException {
final ByteArrayInputStream byteInput = new ByteArrayInputStream(reqBytes);
return new HttpServletRequestWrapper(httpRequest) {
  @Override
  public ServletInputStream getInputStream() throws IOException {
    ServletInputStream sis = new ServletInputStream() {
      @Override
      public int read() throws IOException {
        return byteInput.read();
      }
    };
    return sis;
  }
};
}
有没有更好的办法?我们可以在不消耗流的情况下读取参数吗?(类似于 peek 的东西)我们可以重置流吗?