Sobes.tech
Senior
45

Wie man das Problem der wiederholten Lesung des Anfragekörpers löst (InputStream kann nur einmal gelesen werden)?

Unternehmen wurden gefragt
СБЕРСБЕР

Antwort von AI

sobes.tech KI

Проблема повторного чтения тела запроса в 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) {}
        };
    }
}

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