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!