2011-06-20 22 views
8

¿Cómo podría agregar un encabezado de respuesta - por ejemplo X-Time que sería algo comoGrails - Agregar encabezado a cada respuesta

X-Time: 112

Cuando el valor dado que sería el tiempo en milisegundos que la respuesta llevó al proceso? ¿Hay una manera realmente simple de agregar esto a una aplicación Grails? No es algo que quiera dejar de forma permanente, pero sería bueno tenerlo mientras desarrollaba mi aplicación.

+1

Una aplicación útil de esto es tratar con ['X-UA-Compatible'' http-equiv'] (https://groups.google.com/forum/?fromgroups=#!topic/html5boilerplate/bRtrFSrKjtI) meta etiquetas utilizadas para establecer la versión del renderizador o chromeframe de IE, particularmente mediante el proyecto HTML5 Boilerplate. – cdeszaq

Respuesta

31

Para agregar simplemente un encabezado a la respuesta, puede usar un filtro after.

// grails-app/conf/MyFilters.groovy 
class MyFilters { 
    def filters = { 
     addHeader(uri: '/*') { 
      after = { 
       response.setHeader('X-Time', value) 
      } 
     } 
    } 
} 

Editar:

Para calcular realmente el tiempo, probablemente sería más adecuado utilizar un javax.servlet.Filter en lugar de un filtro de Grails.

src/maravilloso/com/example/miproyecto/MyFilter.groovy

package com.example.myproject 

import javax.servlet.* 

class MyFilter implements Filter { 

    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 

     def start = System.currentTimeMillis() 
     chain.doFilter(request, response) 

     def elapsed = System.currentTimeMillis() - start 
     response.setHeader('X-Time', elapsed as String) 
    } 

    void init(FilterConfig config) { } 
    void destroy() { } 
} 

src/templates/guerra/web.xml (griales ejecutar install-plantillas si src/templates ISN' t ya está en su árbol de fuentes)

<filter> 
    <filter-name>timer</filter-name> 
    <filter-class>com.example.myproject.MyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>timer</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

la razón para usar el javax.servlet.Filter es por lo que no tiene que separar el "antes" y "después" de acciones, y para ello puede e mantener el tiempo de inicio en toda la cadena de filtros & ejecución de servlet.

Indicaciones adicionales:

Para mí, parece extraño a querer devolver el servidor de transcurrido el tiempo de ejecución como una cabecera de respuesta. Quizás tenga una razón decente para hacerlo, pero en la mayoría de los casos, A) me preocuparía más por el tiempo total de ida y vuelta (según lo observado por el cliente), o B) estaría registrando los tiempos de ejecución transcurridos en el servidor para mi propios propósitos de administración/métrica del sistema.

+0

Supongo que podría funcionar ... ¿Cómo podría iniciar el temporizador? y terminarlo? Podría iniciar un temporizador en un filtro anterior, pero ¿cómo obtendría ese valor para el filtro posterior? Buena idea hasta ahora +1 – BuddyJoe

+2

Supongo que solo interpreté tu pregunta preguntando cómo agregarías el encabezado de respuesta; déjame construir una respuesta rápida para realmente cronometrarlo. –

+0

Se ve increíble. Gracias. +1 y respuesta. Solo tengo un sistema donde un cliente puede informar problemas de rendimiento. E incluye cronometrar el tiempo completo de solicitud/respuesta del cliente. Pero también incluye el "tiempo de trabajo"/rendimiento real del servidor. – BuddyJoe

Cuestiones relacionadas