Sono nella situazione in cui la mia applicazione deve ispezionare il contenuto/dati/corpo/payload di una richiesta POST senza modificare i risultati delle successive chiamate getParameter.Leggere il corpo POST di HTTPServletRequest E quindi chiamare getParameter in Tomcat
La lettura del corpo dalla inputStream:
Il corpo può essere letto utilizzando l'InputStream da request.getInputStream
o BufferedReader da request.getReader
.
parametri di lettura del messaggio:
richieste POST di solito includono parametri di richiesta nel corpo della richiesta. Questi possono essere recuperati utilizzando getParameter
.
Il problema:
primo getParameter
chiamata analizza internamente l'inputStream e inserisce tutti i parametri in un parametro HashMap. Richiede che inputStream contenga ancora i contenuti per l'analisi. Pertanto non è possibile ispezionare il contenuto e avere ancora una chiamata getParameter funzionante.
proposto (ma non sufficiente) Soluzione
Creare un wrapper richiesta che memorizza nella cache l'InputStream e restituisce la cache per getInputStream.
Ho visto che la soluzione è stata suggerita in tutto il Web, ma non funziona, perché getParameter
in realtà non chiama getInputStream
, ma si riferisce al buffer di input originale nascosto nell'oggetto di richiesta. L'ho provato, sia dall'interno della Servlet che usando un filtro
L'unica soluzione che posso immaginare riguarda la riscrittura di getParameter per analizzare effettivamente l'inputstream memorizzato nella cache manualmente. Ma questa sembra una cattiva idea.
Qualcuno ha qualche alternativa che funzioni? (Questo è Tomcat 5.5) Sembra che dovrebbe essere un caso d'uso comune; Non posso credere quanto sia difficile.
La risposta a questa domanda non è una soluzione. L'ho implementato e non è riuscito a risolvere il problema. Da allora ho letto l'origine di Tomcat e ho capito che getParameter non chiama getInputStream, come ho detto sopra, e quindi non leggerà dalla versione cache dello stream. vedere http://grepcode.com/file/repo1.maven.org/maven2/tomcat/catalina/5.5.23/org/apache/catalina/connector/RequestFacade.java?av=f#342 Io non sono certo perché la gente sembra aver trovato una soluzione. – rewolf
Il metodo 'getParameter' chiama' getInputStream'. Innanzitutto, la chiamata 'getParameter'' parseParameters', quindi 'parseParameters' chiama' readPostBody', quindi 'readPostBody' chiama' getInputStream'. – peakmuma