Dies sollte besser mit einem Servlet geschehen Filter
als eine Feder HandlerInterceptor
aus dem Grund, dass ein Filter
ist es erlaubt, die Anfrage- und/oder Antwortobjekte zu ersetzen, und Sie könnten diesen Mechanismus nutzen, um die Antwort durch einen Wrapper zu ersetzen, der die Antwortausgabe protokolliert.
Dies würde das Schreiben einer Unterklasse von HttpServletResponseWrapper
überschreiben. getOutputStream
(und möglicherweise auch getWriter()
). Diese Methoden würden Folgendes zurückgeben OutputStream
/ PrintWriter
Implementierungen, die den Antwortstrom nicht nur an das ursprüngliche Ziel, sondern auch in ein Protokoll ableiten. Eine einfache Möglichkeit, dies zu tun, ist die Verwendung von TeeOutputStream
von Apache Commons IO aber es ist nicht schwer, sie selbst zu implementieren.
Hier ein Beispiel dafür, wie Sie mit der Spring-Funktion GenericFilterBean
y DelegatingServletResponseStream
sowie TeeOutputStream
um die Dinge zu erleichtern:
public class ResponseLoggingFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse responseWrapper = loggingResponseWrapper((HttpServletResponse) response);
filterChain.doFilter(request, responseWrapper);
}
private HttpServletResponse loggingResponseWrapper(HttpServletResponse response) {
return new HttpServletResponseWrapper(response) {
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new DelegatingServletOutputStream(
new TeeOutputStream(super.getOutputStream(), loggingOutputStream())
);
}
};
}
private OutputStream loggingOutputStream() {
return System.out;
}
}
Dies protokolliert alles auf STDOUT. Wenn Sie in eine Datei protokollieren wollen, wird es etwas komplizierter, da Sie sicherstellen müssen, dass die Streams geschlossen werden usw., aber das Prinzip bleibt das gleiche.
0 Stimmen
Dies geschieht in der Regel mit Hilfe des Containers...., in dem Sie das Programm ausführen.
0 Stimmen
Ich führe es innerhalb von Jetty 7 über das jetty-maven-plugin aus, aber ich verstehe nicht, warum das eine Rolle spielen sollte. Ich möchte die HTML-Antwort sehen, die der Browser erhalten wird.