Patrzę na realizację HiddenMethodFilter w sitebricks here:Czy można odczytać parametry HttpRequest bez zużywania strumienia?
Na linii 65 znajduje się następujący kod:
try {
String methodName = httpRequest.getParameter(this.hiddenFieldName);
if ("POST".equalsIgnoreCase(httpRequest.getMethod()) && !Strings.empty(methodName)) {
....
sprawdza, czy dany parametr został ustawiony i używa tego zawinąć żądanie . Jednak podczas odczytu tego parametru pobierze strumień, a ewentualny serwlet nie będzie mógł odczytać żadnych danych.
Jaki byłby najlepszy sposób na uniknięcie tego? Zaimplementowałem HttpServletRequestWrapper here, który odczytuje zawartość strumienia do tablicy bajtów. To jednak może zużywać dużo pamięci do przechowywania żądań.
private HttpServletRequestWrapper getWrappedRequest(HttpServletRequest httpRequest, final byte[] reqBytes)
throws IOException {
final ByteArrayInputStream byteInput = new ByteArrayInputStream(reqBytes);
return new HttpServletRequestWrapper(httpRequest) {
@Override
public ServletInputStream getInputStream() throws IOException {
ServletInputStream sis = new ServletInputStream() {
@Override
public int read() throws IOException {
return byteInput.read();
}
};
return sis;
}
};
}
Czy istnieje lepszy sposób? Czy możemy odczytać parametr bez zużywania strumienia? (Niektóre rzeczy podobne do peek) możemy zresetować strumień?
Czy istnieją jakieś alternatywne sposoby uzyskania danych meta ze strony internetowej do kontenera serwletu, który nie wymaga, aby dane znajdowały się w treści żądania? –
Użyj GET zamiast POST. Lub poszukaj alternatywnego podejścia do konkretnego wymogu funkcjonalnego, abyś nie musiał czytać ciała wielokrotnie. – BalusC
@UsmanIsmail: Odczytaj raz input, buforuj go i przekazuj do różnych komponentów, które będą potrzebne do jego przeczytania. – Jim