Назад к вопросам
СБЕР
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) {}
};
}
}
Таким образом, тело запроса можно читать многократно из кэшированного массива байт.