Maison  >  Article  >  Java  >  Comment capturer et enregistrer le contenu de la réponse du servlet HTTP en Java ?

Comment capturer et enregistrer le contenu de la réponse du servlet HTTP en Java ?

DDD
DDDoriginal
2024-11-11 10:16:02504parcourir

How to Capture and Log HTTP Servlet Response Content in Java?

Comment capturer et enregistrer le contenu de la réponse d'un servlet HTTP

Introduction

Enregistrement des requêtes et le contenu de la réponse est essentiel pour un débogage et une surveillance complets côté serveur. Bien que l’accès aux paramètres de la requête via un filtre soit simple, la récupération du contenu de la réponse peut s’avérer plus difficile. Cet article explique comment créer un filtre qui intercepte et copie la réponse du servlet à des fins de journalisation.

Création d'un filtre pour capturer le contenu de la réponse

Pour capturer le contenu de la réponse, nous devons créer un filtre personnalisé qui encapsule l'objet HttpServletResponse et remplace les méthodes getOutputStream() et getWriter(). Ces méthodes sont chargées de fournir des flux pour écrire les données de réponse. En les remplaçant, nous pouvons créer un flux personnalisé qui intercepte les données et les copie dans un tampon.

Voici un exemple de filtre qui accomplit cette tâche :

@WebFilter("/*")
public class ResponseLogger implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response);

        try {
            chain.doFilter(request, responseCopier);
            responseCopier.flushBuffer();
        } finally {
            byte[] copy = responseCopier.getCopy();
            System.out.println(new String(copy, response.getCharacterEncoding()));
        }
    }
}

Personnalisation du Response Wrapper

La classe HttpServletResponseCopier encapsule le HttpServletResponse d'origine et crée un ServletOutputStream personnalisé qui intercepte les données. Les méthodes getOutputStream() et getWriter() substituées créent et renvoient l'instance ServletOutputStreamCopier.

public class HttpServletResponseCopier extends HttpServletResponseWrapper {

    private ServletOutputStreamCopier copier;

    @Override
    public ServletOutputStream getOutputStream() {
        if (copier == null) {
            copier = new ServletOutputStreamCopier(getResponse().getOutputStream());
        }
        return copier;
    }

    @Override
    public PrintWriter getWriter() {
        if (copier == null) {
            copier = new ServletOutputStreamCopier(getResponse().getOutputStream());
        }
        return new PrintWriter(new OutputStreamWriter(copier, getResponse().getCharacterEncoding()), true);
    }
}

Interception et copie des données de réponse

La classe ServletOutputStreamCopier remplace l'écriture( int b) méthode pour intercepter les données écrites dans la réponse. Il écrit les données dans le flux d'origine tout en les copiant également dans un ByteArrayOutputStream pour une récupération ultérieure.

public class ServletOutputStreamCopier extends ServletOutputStream {

    private ByteArrayOutputStream copy;

    @Override
    public void write(int b) {
        outputStream.write(b);
        copy.write(b);
    }

    public byte[] getCopy() {
        return copy.toByteArray();
    }
}

Récupération de la réponse capturée

Après le cycle demande-réponse est terminée, le filtre récupère le contenu de la réponse capturée à partir de la méthode getCopy() de ServletOutputStreamCopier. Ces données peuvent ensuite être utilisées à des fins de journalisation ou à toute autre fin souhaitée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn