Lorsque vous essayez d'accéder à la InputStream
première d'une demande de servlet x-www-form-urlencoded
, le courant aurait déjà été indirectement consommée par un accès avant les paramètres (par exemple, par l'intermédiaire ServletRequest#getParameterMap()
) de la demande. Cette fonctionnalité (bug?) A déjà été documentée dans the section SRV.3.1.1 of the Servlet spec et il y a other people qui ont été mordus par cela aussi.Accès InputStream de x-www-form-urlencoded ServletRequest
Cette consommation indirecte de flux rend, au meilleur de ma connaissance, impossible de reproduire le InputStream
, ce qui est exactement ce que nous essayons d'atteindre en HRRS. Par conséquent, j'essaie de re-construct the InputStream
from request parameters. Ceci, comme vous pouvez l'imaginer, un hack vraiment méchant que je n'aime pas non plus. En outre, pour aggraver les choses, lorsque servlet pousse les paramètres de formulaire dans la carte de paramètres de requête, il les fusionne avec les paramètres de requête aussi. Vous devez maintenant analyser manuellement les paramètres de requête et de requête pour déterminer les paramètres de formulaire initiaux. Un naufrage total.
Des idées sur la façon de remplacer ce hack avec une solution appropriée?
Éditer:Chers propriétaires de badbones Java, ce n'est pas une question en double. S'il vous plaît voir le rapport de bug de Tomcat avant de marquer le poste en double. Même si HRRS est le premier filtre de la liste, il ne consomme pas InputStream
, il encapsule simplement le InputStream
et transmet la requête encapsulée le long de la chaîne. Le problème est, getParameter()
appels dans Tomcat utilise une référence interne au InputStream
(c'est-à o.a.c.connector.Request#getStream()
) et n'appelant pas javax.servlet.ServletRequest#getInputStream()
. Par conséquent, InputStream
est indirectement consommée sans que l'enveloppe ne soit utilisée du tout. (Voir o.a.c.connector.Request#readPostBody()
code source pour plus de détails.)
Même si HRRS est le premier filtre de la liste, il consomme * non * InputStream, il ne fait qu'encapsuler le paramètre «InputStream» et transmet la requête encapsulée le long de la chaîne. Le problème est que les appels 'getParameter()' dans Tomcat utilisent une référence interne à 'InputStream', n'appelant pas' getInputStream() '. De ce fait, 'InputStream' est indirectement consommé sans que le 'wrapped' ne soit utilisé du tout. –
Pour les enregistrements, voir 'o.a.c.connector.Request # readPostBody()' pour plus de détails. –