Sobes.tech
Назад к вопросам
Senior
2

Как решить проблему повторного чтения тела запроса (InputStream читается только один раз)?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Проблема повторного чтения тела запроса в Java связана с тем, что InputStream можно прочитать только один раз. Чтобы решить эту проблему, обычно используют обертку, которая кэширует тело запроса, позволяя читать его несколько раз.

Например, в сервлетах можно создать класс, наследующий HttpServletRequestWrapper, который сохраняет тело в буфер:

public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
    private byte[] cachedBody;

    public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
        super(request);
        InputStream requestInputStream = request.getInputStream();
        this.cachedBody = requestInputStream.readAllBytes();
    }

    @Override
    public ServletInputStream getInputStream() {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.cachedBody);
        return new ServletInputStream() {
            @Override
            public int read() {
                return byteArrayInputStream.read();
            }
            @Override
            public boolean isFinished() {
                return byteArrayInputStream.available() == 0;
            }
            @Override
            public boolean isReady() {
                return true;
            }
            @Override
            public void setReadListener(ReadListener listener) {}
        };
    }
}

Таким образом, тело запроса можно читать многократно из кэшированного массива байт.