Sobes.tech
Senior

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

sobes.tech AI

Отговор от 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) {}
        };
    }
}

По този начин тялото на заявката може да бъде прочетено многократно от кеширания масив от байтове.