questo sarebbe meglio fatto utilizzando una Servlet Filter
piuttosto che una molla HandlerInterceptor
, per la ragione che un Filter
è consentito di sostituire la richiesta e/o di risposta degli oggetti, e si potrebbe utilizzare questo meccanismo per sostituire la risposta con un involucro che registra l'output della risposta.
Ciò comporterebbe la scrittura di una sottoclasse di HttpServletResponseWrapper
, che sostituisce getOutputStream
(ed eventualmente anche getWriter()
). Questi metodi restituiscono le implementazioni OutputStream
/PrintWriter
che prelevano il flusso di risposta in un registro, oltre a inviare alla destinazione originale. Un modo semplice per farlo è utilizzare TeeOutputStream
da Apache Commons IO, ma non è difficile da implementare.
Ecco un esempio del tipo di cosa che si potrebbe fare, facendo uso di Primavera di GenericFilterBean
e DelegatingServletResponseStream
, così come TeeOutputStream
, per rendere le cose più facili:
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;
}
}
Questo registra tutto ciò che a STDOUT. Se si desidera accedere a un file, questo diventerà molto più complesso, con ciò assicurandosi che gli stream vengano chiusi e così via, ma il principio rimane lo stesso.
Questo è solitamente fatto con l'aiuto di il contenitore ... a cosa stai lavorando? – skaffman
Lo sto eseguendo all'interno del Jetty 7 tramite il jetty-maven-plugin, ma non vedo perché questo dovrebbe avere importanza. Voglio vedere la risposta html che il browser sta per ricevere. – csamuel