Maison > Java > javaDidacticiel > le corps du texte

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

DDD
Libérer: 2024-11-11 10:16:02
original
465 Les gens l'ont consulté

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()));
        }
    }
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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();
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal