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