Question

Je suis en train de se connecter le corps brut des requêtes HTTP POST dans notre application sur Struts, en cours d'exécution sur Tomcat 6. Je l'ai trouvé un post précédent sur ce qui était un peu utile, mais la solution retenue ne fonctionne pas correctement dans mon cas. Le problème est, je veux connecter le corps POST que dans certains cas, et laisser Struts analyser les paramètres du corps après la coupe. À l'heure actuelle, dans le filtre, j'ai écrit que je peux lire et enregistrer le corps de l'objet HttpServletRequestWrapper, mais après que Struts ne trouve pas de paramètres pour analyser, de sorte que l'appel DispatchAction (qui dépend de l'un des paramètres de la requête) tombe en panne.

Je l'ai fait quelques recherches dans le code source Struts et Tomcat, et a constaté que peu importe si je stocke le corps POST dans un tableau d'octets et un ruisseau et exposer un lecteur basé sur ce tableau; lorsque les paramètres doivent s'analysable, l'objet de demande de Tomcat accède à son InputStream interne, qui a déjà été lu par ce moment-là.

Quelqu'un at-il une idée de comment mettre en œuvre ce type d'exploitation forestière correctement?

Était-ce utile?

La solution

En fait, Struts ne pas analyser les paramètres, il repose sur le conteneur de servlets pour le faire. Et une fois que le conteneur a lu le fluxEntrée pour créer la carte des paramètres, bien sûr il n'y a rien à lire. Et dans la mise en œuvre Tomcat, si vous lisez le fluxEntrée d'abord, puis la getParameter * famille de méthodes n'a plus rien à travailler, puisque, comme vous le notez correctement, il n'utilise pas getInputStream ou getReader mais accède à l'intérieur de son lecteur optimisé. Donc, votre seule solution dans votre ServletRequestWrapper est de passer outre getInputStream, getReader, et la famille getParameter * sur lequel repose Struts pour lire les paramètres. Peut-être que vous pouvez jeter un oeil à org.apache.catalina.util.RequestUtil de ne pas dupliquer la partie POST corps l'analyse syntaxique.

Autres conseils

Qu'est-ce que vous avez à faire dans votre filtre est lu le contenu du message dans son intégralité puis quand vous allez transmettre la demande à la chaîne; sauvegarder le flux d'entrée avec votre propre. Par exemple, vous lisez le courrier à déposer sur le disque, puis lorsque vous appelez:

chain.doFilter(new ServletRequest() {}, response);

Vous pouvez déléguer la plupart des méthodes de votre classe invocations à la demande initiale, mais quand vient le temps d'ouvrir le flux d'entrée, vous devez lire à partir du fichier sur le disque.

Vous devez vous assurer que vous ne fuit pas les ressources que cela sera invoqué assez souvent et peut faire du mal si mal fait.

semble bon et doit travailler dans l'exemple du filtre lié à une question. Peut-être que vous définissez dans le web.xml après le filtre répartiteur Struts. Il serait alors en effet trop tard pour analyser et enregistrer le corps de la demande et de faire encore disponible pour Struts. Vous devez déclarer ce filtre avant le filtre répartiteur Struts. Les questions de commande filtre, ils sont invoqués dans l'ordre qu'ils DÉFINIES dans web.xml.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top