Erfassen und Protokollieren des Inhalts des HTTP-Servlet-Antwort-Ausgabestreams
Bei Java-Webservern kann es vorkommen, dass Sie sowohl die eingehende Anfrage protokollieren müssen Parameter und die daraus resultierende Serverantwort. Dieser Artikel bietet eine Lösung zum Abrufen des Inhalts des HTTP-Servlet-Antwort-Ausgabestreams für Protokollierungszwecke.
Um dies zu erreichen, können Sie einen Filter verwenden, um das HttpServletResponse-Objekt mit einer benutzerdefinierten Implementierung namens HttpServletResponseWrapper zu umschließen. Innerhalb dieses Wrappers überschreiben wir die Methoden getOutputStream() und getWriter(), um eine angepasste ServletOutputStream-Implementierung, ServletOutputStreamCopier, zurückzugeben.
Der ServletOutputStreamCopier umschließt den ursprünglichen Ausgabestream und kopiert die geschriebenen Bytes in einen ByteArrayOutputStream, auf den als Byte[ zugegriffen werden kann. ] über die getCopy()-Methode.
Sobald der benutzerdefinierte Antwort-Wrapper vorhanden ist, übergeben wir ihn an den FilterChain#doFilter()-Aufruf. Nachdem der Anfrage-Antwort-Zyklus abgeschlossen ist, rufen wir den kopierten Antwortinhalt vom ServletOutputStreamCopier zur Protokollierung ab.
Hier ist eine Beispielimplementierung eines solchen Filters:
public class ResponseLogger implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { if (response.getCharacterEncoding() == null) { response.setCharacterEncoding("UTF-8"); } HttpServletResponseCopier responseCopier = new HttpServletResponseCopier((HttpServletResponse) response); chain.doFilter(request, responseCopier); responseCopier.flushBuffer(); byte[] copy = responseCopier.getCopy(); System.out.println(new String(copy, response.getCharacterEncoding())); } }
Diese Filterimplementierung erfasst die Antwort Ausgabe als Byte-Array, sodass Sie die Protokollierung oder jede andere notwendige Verarbeitung durchführen können.
Die Codeausschnitte für HttpServletResponseCopier und ServletOutputStreamCopier werden ebenfalls bereitgestellt, um die Lösung zu vervollständigen.
Das obige ist der detaillierte Inhalt vonWie erfasst und protokolliert man HTTP-Servlet-Antwort-Ausgabestream-Inhalte in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!