Mi chiedo se posso usare un filtro (nel mio caso un CorsFilter) per misurare il tempo E per dedicare il tempo al messaggio stesso. So che il seguente funziona bene:Come utilizzare un filtro per misurare le prestazioni?
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
chain.doFilter(request, response);
long endTime = System.nanoTime();
System.out.println("Time: " + (endTime - startTime));
}
Che ovviamente emette il tempo totale in secondi. Volevo inserire il tempo nell'intestazione della risposta restituita in modo che il destinatario potesse guardare l'intestazione e vedere quanto tempo ci voleva. Il seguente codice non funziona:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("Start-time", Long.toString(startTime));
}
chain.doFilter(request, response);
long endTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("End-time", Long.toString(endTime));
}
}
L'intestazione include solo ora di inizio e non di fine. Presumo che ciò sia dovuto al fatto che il messaggio è già stato inviato in modo che la modifica dell'oggetto non abbia alcun effetto.
Qualcuno ha una soluzione elegante/intelligente per inserire i tempi nell'intestazione tramite l'uso di un filtro?
Grazie, Phil
Aggiornamento
ho studiato l'uso di un HttpServletResponseWrapper per affrontare questa soluzione. Ciò non riesce ancora a produrre né XXX-EndTime né YYY-EndTime nell'intestazione della risposta.
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("Access-Control-Allow-Origin", "*");
httpResp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS");
httpResp.addHeader("Allow", "GET, HEAD, OPTIONS");
httpResp.addHeader("Access-Control-Allow-Headers", "*");
httpResp.addHeader("A-Runtime", Long.toString(startTime));
}
OutputStream out = response.getOutputStream();
GenericResponseWrapper wrapper = new GenericResponseWrapper((HttpServletResponse) response);
chain.doFilter(request,wrapper);
out.write(wrapper.getData());
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("XXX-EndTime", Long.toString(System.nanoTime() - startTime));
wrapper.addHeader("YYY-EndTime", Long.toString(System.nanoTime() - startTime));
}
out.close();
}
-1 risposte lik questo apre più domande poi rispondono. – Yevgeniy
@YevgeniyM. hai ragione, dovrebbe essere stato un commento, che esiste una classe wrapper +1. –
Ok, ho implementato una soluzione usando HttpServletResponseWrapper ma ancora non riesco a farlo funzionare! Aggiornerò la domanda di cui sopra con il mio nuovo codice. – Phil