Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多次访问请求流_Java_Httprequest - Fatal编程技术网

Java 多次访问请求流

Java 多次访问请求流,java,httprequest,Java,Httprequest,我想使用getInputStream()从请求中获取请求体。我制作了一个Requestwrapper以便缓存请求,但它似乎不起作用,因为当我调用getInputStream()或getReader()时,流已关闭异常仍会出现。 我做错了什么 这是我的来电代码: RequestWrapper request = new RequestWrapper(((ServletRequestAttributes) RequestContextHolder .currentRequestAttribute

我想使用getInputStream()从请求中获取请求体。我制作了一个Requestwrapper以便缓存请求,但它似乎不起作用,因为当我调用getInputStream()或getReader()时,流已关闭异常仍会出现。 我做错了什么

这是我的来电代码:

RequestWrapper request = new RequestWrapper(((ServletRequestAttributes) RequestContextHolder
  .currentRequestAttributes())
 .getRequest());

InputStream obj = request.getInputStream(); //**java.io.IOException: Stream closed**
以下是应缓存请求的请求包装器类:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;

public class RequestWrapper extends HttpServletRequestWrapper {
 private ByteArrayOutputStream cachedBytes;

 public RequestWrapper(HttpServletRequest request) {
  super(request);
 }

 @Override
 public ServletInputStream getInputStream() throws IOException {
  if (cachedBytes == null) {
   cacheInputStream();
  }
  System.out.println("cachednotnull");
  return new CachedServletInputStream();
 }

 @Override
 public BufferedReader getReader() throws IOException {
  return new BufferedReader(new InputStreamReader(getInputStream()));
 }

 private void cacheInputStream() throws IOException {
  /* Cache the inputstream in order to read it multiple times. For
   * convenience, I use apache.commons IOUtils
   */
  cachedBytes = new ByteArrayOutputStream();
  IOUtils.copy(super.getInputStream(), cachedBytes);
 }

 /* An inputstream which reads the cached request body */
 public class CachedServletInputStream extends ServletInputStream {
  private ByteArrayInputStream input;

  public CachedServletInputStream() {
   /* create a new input stream from the cached request body */
   input = new ByteArrayInputStream(cachedBytes.toByteArray());
  }

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

  @Override
  public boolean isReady() {
   return true;
  }

  @Override
  public void setReadListener(ReadListener listener) {
   throw new RuntimeException("Not implemented");
  }

  @Override
  public int read() throws IOException {
   // TODO Auto-generated method stub
   return input.read();
  }
 }
}

只有当处理请求的所有代码都使用相同的
RequestWrapper
实例时,这才有效。这意味着,如果在
@Controller
方法中有一个
@RequestBody
参数,即使Spring也应该使用它。这意味着你所做的事情应该在
过滤器中完成。如果我猜对了,而你不是在
过滤器中完成的,请参见例如@Andreas Thank alot,是的,这就是问题所在,在我的其他过滤器中使用它也可以解决它:)