Sobes.tech
Senior

Hoe los je het probleem van het herhaald lezen van de request body (InputStream wordt slechts één keer gelezen)?

sobes.tech AI

Antwoord van 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) {}
        };
    }
}

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