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