Come faccio a separare i parametri della stringa di query dai dati POST in un servlet java
Domanda
Quando si riceve una chiamata doGet o doPost in un servlet, è possibile utilizzare getparameterxxx ()
per ottenere la stringa di query o i dati di post in un unico posto.
Se la chiamata era GET, si ottengono dati dalla stringa url / query.
Se la chiamata era un POST, ottieni i dati dei post tutti analizzati per te.
Ad eccezione di quanto risulta, se non si inserisce un attributo "azione" nella chiamata del modulo. Se specifichi un url completo o parzialmente qualificato per il parametro di azione, tutto funziona alla grande, in caso contrario, il browser chiamerà lo stesso url che aveva fatto nella pagina precedente, e se ci sono dati di stringa di query lì , otterrai anche i dati POST e non c'è modo di distinguerli.
O c'è? Sto esaminando l'oggetto richiesta, vedo da dove provengono i dati dei post, sto solo cercando di capire da dove provengono i dati GET, in modo da poter cancellare i dati GET su una chiamata post e cancellare i dati post su una chiamata GET prima di analizzarla, se possibile.
Hai idea di quale sia il modo sicuro per farlo?
E lasciami indovinare: non hai mai provato a non inserire un campo di azione in un tag del modulo. : -)
Soluzione
In HTML, l'azione è REQUIRED , quindi immagino che il comportamento varierà tra i clienti.
Altri suggerimenti
Hai ragione, non ho mai provato a non inserire un campo di azione in un tag modulo ;-) e non lo farei, proprio per quello di cui stai parlando. (Inoltre, penso che non sia un codice HTML valido)
Non conosco nessun "pulito" modo di distinguere tra i parametri GET e POST, ma puoi accedere alla stringa di query non elaborata utilizzando il metodo getQueryString ()
di HttpServletRequest
e puoi accedere ai dati POST non elaborati utilizzando Metodo getInputStream ()
di ServletRequest
. (Sto esaminando i documenti API Tomcat specificatamente qui, anche se penso che siano entrambi parte dell'API Servlet standard) Quindi puoi analizzare i dati POST e GET separatamente se vuoi. Saranno (o dovrebbero normalmente) entrambi formattati allo stesso modo, ad esempio
name1=value1&name2=value2&...
sebbene possibilmente con le e commerciali sostituite da punti e virgola (cosa che puoi tecnicamente fare in HTTP / 1.1, non lo sapevo fino a poco tempo fa)
I metodi HttpServletRequest.getParameterxxx () non fanno distinzione tra i parametri GET e POST. Se devi veramente distinguerli, dovrai analizzarli manualmente usando getQueryString () per i parametri GET e getInputStream () / getReader () per i dati POST.
Scriverei un ServletFilter e decorerei l'oggetto richiesta per ripulire un po 'le cose (usando ciò che Hilton ha suggerito sopra). Questo è il modello decorativo classico in un filtro intercettante .