Znajduję się w sytuacji, w której moja aplikacja musi sprawdzić zawartość/dane/treść/ładunek żądania POST, nie zmieniając wyników kolejnych wywołań funkcji getParameter.Przeczytaj treść instrukcji POST HTTPServletRequest, a następnie wywołaj metodę getParameter w Tomcat.
Czytając ciało od InputStream:
Ciało można odczytać za pomocą InputStream od request.getInputStream
lub BufferedReader od request.getReader
.
parametry Reading Post:
żądania POST zazwyczaj zawierają parametry żądania w treści wniosku. Można je odzyskać za pomocą getParameter
.
problem:
pierwszy getParameter
połączenia wewnętrznie analizuje InputStream i wstawia wszystkie parametry do HashMap parametrów. Wymaga, aby inputStream nadal zawierał zawartość do parsowania. Zatem nie można sprawdzić zawartości i nadal mieć działające wywołanie getParameter.
Proponowany (ale nie wystarczający) Rozwiązanie
Tworzenie owijkę żądania że buforuje InputStream i zwraca cache dla getInputStream.
Widziałem to rozwiązanie zasugerowane w całym Internecie, ale nie działa, ponieważ getParameter
w rzeczywistości nie wywołuje getInputStream
, ale odnosi się do oryginalnego inputBuffer pochowany w obiekcie żądania. Próbowałem go, zarówno z Serwletu, jak i używając filtru. Jedyne rozwiązanie, jakie mogę wymyślić, to przepisanie funkcji getParameter, aby ręcznie parsować ręcznie buforowany strumień wejściowy. Ale to jest zły pomysł.
Czy ktoś ma jakąś alternatywę, która działa? (To jest Tomcat 5.5) Wydaje się, że powinien to być typowy przypadek użycia; Nie mogę uwierzyć, jakie to trudne.
Odpowiedź na to pytanie nie jest rozwiązaniem. Zaimplementowałem go i nie udało się rozwiązać problemu. Od tego czasu czytałem źródło tomcat i zdałem sobie sprawę, że getParameter nie wywołuje metody getInputStream, jak napisałem powyżej, a zatem nie odczytałoby jej z buforowanej wersji strumienia. patrz http://grepcode.com/file/repo1.maven.org/maven2/tomcat/catalina/5.5.23/org/apache/catalina/connector/RequestFacade.java?av=f#342 Nie jestem pewnie, dlaczego ludzie uważają to za rozwiązanie. – rewolf
Metoda 'getParameter' wywołaj' getInputStream'. Najpierw wywołaj 'getParameter' wywołaj' parseParameters', następnie 'parseParameters' wywołaj' readPostBody', następnie 'readPostBody' wywołaj' getInputStream'. – peakmuma