Pergunta

Estou tentando registrar o corpo bruto de solicitações de postagem http em nosso aplicativo com base em suportes, rodando no tomcat 6. Encontrei um postagem anterior Por isso, foi um pouco útil, mas a solução aceita não funciona corretamente no meu caso. O problema é que quero registrar o corpo da postagem apenas em certos casos, e Deixe os struts analisar os parâmetros do corpo após o registro. Atualmente, no filtro que escrevi, posso ler e registrar o corpo a partir do objeto HttpServletRequestWrapper, mas depois disso não conseguir encontrar parâmetros para analisar, de modo que a chamada de Dispatchaction (que depende de um dos parâmetros da solicitação) falha.

Fiz algumas escavação através de suportes e código -fonte do Tomcat e descobri que não importa se eu armazenei o corpo da postagem em uma matriz de bytes e exponho um fluxo e um leitor com base nessa matriz; Quando os parâmetros precisam ser analisados, o objeto de solicitação do Tomcat acessa seu InputStream interno, que já foi lido naquele momento.

Alguém tem uma ideia de como implementar esse tipo de registro corretamente?

Foi útil?

Solução

De fato, os suportes não analisam os parâmetros, ele depende do contêiner do servlet para fazer isso. E uma vez que o contêiner leia o InputStream para criar o mapa de parâmetros, é claro que não há mais nada para ler. E na implementação do Tomcat, se você ler o InputStream primeiro, a família de métodos getParameter* não tem mais nada para trabalhar, pois, como você observa corretamente, ele não usa GetInputStream ou GetReader, mas acessa internamente seu leitor otimizado. Portanto, sua única solução no seu servletRequestWrapper é substituir o getInputStream, o GetReader e a família GetParameter*, na qual os struts confiam para ler os parâmetros. Talvez você possa dar uma olhada no org.apache.catalina.util.requestutil para não duplicar a parte da análise do corpo pós.

Outras dicas

O que você precisa fazer em seu filtro é ler o conteúdo da postagem na íntegra, quando você passa a solicitação para a cadeia; de volta o fluxo de entrada com o seu. Por exemplo, você leu a postagem para arquivar no disco, então quando você liga:

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

Você pode delegar a maioria das invocações de métodos da sua classe para a solicitação original, mas quando chegar a hora de abrir o fluxo de entrada, você precisa ler do seu arquivo no disco.

Você precisa garantir que não vaze recursos, pois isso será invocado com bastante frequência e pode prejudicar se for feito incorretamente.

O exemplo do filtro vinculado na pergunta parece bom e deve funcionar. Talvez você esteja definindo no web.xml depois o filtro do despachante de struts. Na verdade, seria tarde demais para analisar e registrar o corpo da solicitação e ainda disponibilizá -lo para suportes. Você precisa declarar este filtro antes da o filtro do despachante de struts. O filtro de pedidos de filtro é importante, eles são invocados na ordem, pois são definidos em web.xml.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top