60 votes

Comment lire et copier le contenu du flux de sortie de la réponse du servlet HTTP pour la journalisation

J'ai créé un filtre sur mon serveur Web Java (moteur d'application en fait) qui enregistre les paramètres d'une requête entrante. J'aimerais également enregistrer la réponse résultante écrite par mon serveur Web. Bien que j'aie accès à l'objet de réponse, je ne sais pas comment en extraire la réponse de chaîne/contenu réelle.

Des idées?

17voto

omilus Points 498

La solution BalusC est correcte, mais peu obsolète. Le printemps a maintenant une fonctionnalité pour cela. Tout ce que vous avez à faire est d'utiliser [ContentCachingResponseWrapper] , qui a la méthode public byte[] getContentAsByteArray() .

Je suggère de faire WrapperFactory qui permettra de le rendre configurable, que ce soit pour utiliser ResponseWrapper ou ContentCachingResponseWrapper par défaut.

15voto

Shrinivasan Points 151

Au lieu de créer un HttpServletResponseWrapper personnalisé. Vous pouvez utiliser ContentCachingResponseWrapper car il fournit la méthode getContentAsByteArray().

 public void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
            FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = servletRequest;
        HttpServletResponse response = servletResponse;
        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
        ContentCachingResponseWrapper responseWrapper =new ContentCachingResponseWrapper(response);
        try {
            super.doFilterInternal(requestWrapper, responseWrapper, filterChain);

        } finally {

            byte[] responseArray=responseWrapper.getContentAsByteArray();
            String responseStr=new String(responseArray,responseWrapper.getCharacterEncoding());
            System.out.println("string"+responseStr);       
            /*It is important to copy cached reponse body back to response stream
            to see response */
            responseWrapper.copyBodyToResponse();

        }

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X