Доступ к потоку запросов несколько раз - PullRequest
0 голосов
/ 03 ноября 2019

Я хочу получить тело запроса из запроса с помощью getInputStream (). Я сделал Requestwrapper, чтобы я мог кэшировать запрос, но он, похоже, не работает, так как поток закрыт, исключение возникает в любом случае, когда я вызываю getInputStream () или getReader (). Что я делаю не так?

Вот мой код звонящего:

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

InputStream obj = request.getInputStream(); //**java.io.IOException: Stream closed**

Вот класс Request Wrapper, который должен кэшировать запрос:

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();
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...