Как изменить тело запроса в методе HttpServletRequest с помощью HandlerInterceptorAdapter - PullRequest
0 голосов
/ 06 декабря 2018

Я пытался использовать HttpRequestWrapper, но он продолжает выдавать исключение для закрытого потокаНиже мой код HttpRequestWrapper.Я пытался изменить тело запроса в методе preHandle.после изменения тела запроса я хочу отправить его на контроллер.Кажется, что HandlerInterceptorAdapter был вызван дважды.Во второй раз жалуется, что поток закрыт.Я видел пост, связанный с этой проблемой, но я не мог найти решение.

public class RequestWrapper extends HttpServletRequestWrapper {
private final String body;
public RequestWrapper(HttpServletRequest request) throws IOException {
    super(request);
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;
    try {
        InputStream inputStream = request.getInputStream();
        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);
            }
        } else {
            stringBuilder.append("");
        }
    } catch (IOException ex) {
        throw ex;
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }
    body = stringBuilder.toString();
}

@Override
public ServletInputStream getInputStream() throws IOException {
    final ByteArrayInputStream byteArrayInputStream = new     ByteArrayInputStream(body.getBytes());
    ServletInputStream servletInputStream = new ServletInputStream() {
        @Override public boolean isFinished() {
            return false;
        }

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

        @Override public void setReadListener(ReadListener readListener) {

        }

        public int read() throws IOException {
            return byteArrayInputStream.read();
        }
    };
    return servletInputStream;
}

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

public String getBody() {
    return this.body;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...