2012-01-03 9 views
6

En mi acción de controlador intenté configurar el contentType de la respuesta como se muestra a continuación.grails response.addHeader o setHeader no es posible en el filtro una vez que response.setContentType se toca en la acción del controlador

class MyController { 
    def rss = { 
     response.setContentType('text/xml') 
     //I even tried setHeader('contentType') and also render(contentType:'text/xml',...) 
     render(template:'/displayRss', model:[:]) 
    } 
} 

En el filtro i intentaron establecer la cabecera para todos controlador y la acción params se añade

class Filter { 
    def filters = { 
     all(controller:'*', action:'*'){ 
     after = { 
      response.setHeader('Cache-Control', 'no-cache') 
     } 
     } 
    } 
} 

Header para todas las otras acciones a excepción de la acción en la que se modifica contentType respuesta. Parece que response.isCommitted() se devuelve como verdadero solo en esa acción. ¿No entiendo lo básico de renderizar ...?

También este no es el caso si uso render (Ver: '/ abc') en lugar de vista (plantilla: '/ abc', modelo: [:])

Gracias de antemano

Respuesta

1

Parece que la presentación de una plantilla envía la plantilla inmediatamente cuando se le llama, ya que se muestra como ya se confirmó en el filtro. Dado que está comprometido, los encabezados ya se han enviado y establecer un encabezado después del hecho no tiene sentido, por lo que se ignora el setHeader en el filtro.

Supongo que esta es una peculiaridad de las plantillas de renderizado específicamente, y en esos casos deberá configurar el encabezado de la caché en la acción del controlador de forma explícita, o utilizar la representación de la vista en su lugar.

Cuestiones relacionadas