2017-09-18 4 views
1

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.)

Répondre

0

Je ne pense pas qu'il soit possible de recréer complètement la requête d'origine dans tous les cas. L'ordre des paramètres de la requête sera perdu par exemple.

Pour un outil comme celui-ci, je pense qu'il est parfaitement acceptable de s'attendre à être le filtre le plus externe. De cette façon, vous ne devriez pas avoir le problème en premier lieu. Mais peut-être qu'il me manque quelque chose?

+0

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. –

+0

Pour les enregistrements, voir 'o.a.c.connector.Request # readPostBody()' pour plus de détails. –