Lesen Sie den POST-Body von HTTPServletRequest und rufen Sie dann getParameter in Tomcat auf
Ich bin in der Situation, in der meine Anwendung den Inhalt / die Daten / den Körper / die Nutzdaten einer POST-Anforderung überprüfen muss, ohne die Ergebnisse nachfolgender getParameter-Aufrufe zu ändern.
Den Body aus dem inputStream lesen:
Der Body kann mit dem InputStream von gelesen werdenrequest.getInputStream
oder BufferedReader vonrequest.getReader
.
POST-Parameter lesen:
POST-Anforderungen enthalten normalerweise Anforderungsparameter im Hauptteil der Anforderung. Diese können mit abgerufen werdengetParameter
.
Das Problem:
Der ErstegetParameter
call analysiert den inputStream intern und fügt alle Parameter in eine Parameter-HashMap ein. Der inputStream muss weiterhin den Inhalt für das Parsen enthalten. Daher kann man den Inhalt nicht überprüfen und hat immer noch einen funktionierenden getParameter-Aufruf.
Vorgeschlagene (aber nicht ausreichende) Lösung
Erstellen Sie einen Anforderungswrapper, der den Eingabestream zwischenspeichert und den Cache für getInputStream zurückgibt.
Ich habe diese Lösung im ganzen Web gesehen, aber sie funktioniert nicht, weilgetParameter
ruft eigentlich nicht angetInputStream
bezieht sich jedoch auf den ursprünglichen inputBuffer, der im Anforderungsobjekt vergraben ist. Ich habe es versucht, sowohl aus dem Servlet heraus als auch mit einem Filter
Die einzige Lösung, die ich mir vorstellen kann, besteht darin, getParameter neu zu schreiben, um den zwischengespeicherten Eingabestream tatsächlich manuell zu analysieren. Aber das fühlt sich nach einer schlechten Idee an.
Hat jemand eine Alternative, die funktioniert? (Dies ist Tomcat 5.5) Dies scheint ein allgemeiner Anwendungsfall zu sein. Ich kann nicht glauben, wie schwierig es ist.