2009-08-30 10 views

Respuesta

8

No parece haber una manera simple de hacerlo, pero no es mucho trabajo. Mi solución subclasifica el servlet que procesa los GSP (y también el controlador que se usa para no GSP peticiones.)

Aquí está la subclase de servlets:

package com.burtbeckwith; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.codehaus.groovy.grails.web.pages.GroovyPagesServlet; 

public class CachingPageServlet extends GroovyPagesServlet { 

    private static final String HEADER_PRAGMA = "Pragma"; 
    private static final String HEADER_EXPIRES = "Expires"; 
    private static final String HEADER_CACHE_CONTROL = "Cache-Control"; 

    @Override 
    public void doPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setHeader(HEADER_PRAGMA, "no-cache"); 
     response.setDateHeader(HEADER_EXPIRES, 1L); 
     response.setHeader(HEADER_CACHE_CONTROL, "no-cache"); 
     response.addHeader(HEADER_CACHE_CONTROL, "no-store"); 
     super.doPage(request, response); 
    } 
} 

y que tendrá que reemplazar el original en web.xml ("griales instalar las plantillas" de ejecución y edición src/templates/guerra/web.xml):

<servlet> 
    <servlet-name>gsp</servlet-name> 
    <servlet-class>com.burtbeckwith.CachingPageServlet</servlet-class> 
</servlet> 

y es probable que también quieren hacer lo mismo con las respuestas basadas en controlador, por lo que hacer que el uso de este controlador subclase:

package com.burtbeckwith; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.codehaus.groovy.grails.web.servlet.mvc.SimpleGrailsController; 
import org.springframework.web.servlet.ModelAndView; 

public class CachingSimpleGrailsController extends SimpleGrailsController { 

    private static final String HEADER_PRAGMA = "Pragma"; 
    private static final String HEADER_EXPIRES = "Expires"; 
    private static final String HEADER_CACHE_CONTROL = "Cache-Control"; 

    @Override 
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 
     response.setHeader(HEADER_PRAGMA, "no-cache"); 
     response.setDateHeader(HEADER_EXPIRES, 1L); 
     response.setHeader(HEADER_CACHE_CONTROL, "no-cache"); 
     response.addHeader(HEADER_CACHE_CONTROL, "no-store"); 
     return super.handleRequest(request, response); 
    } 
} 

y tendrá que registrarlo en griales-app/conf/primavera/resources.groovy para anular la ordinaria de primavera bean:

mainSimpleController(com.burtbeckwith.CachingSimpleGrailsController) { 
    grailsApplication = ref('grailsApplication', true) 
} 

El código de configuración de encabezado compartido probablemente debería extraerse en una clase de utilidad en lugar de copiarse/pegarse como hice aquí.

+0

Gracias por la respuesta detallada. ¿Por cuánto tiempo se almacenan en caché las páginas gsp de manera predeterminada? Además, ¿qué recomendarías hacer para entornos de producción? – Emmett

2

Asegúrate de que estés ejecutando en modo dev (es decir, ejecutar la aplicación de grails y no grails test | prod ejecutar-app, prueba y producción habilitará el almacenamiento en memoria caché de las páginas. Si estás en modo dev, intenta mantener el turno cuando haga clic en la actualización de Firefox

1

Si simplemente desea desactivar la caché de su navegador mientras que el desarrollo, puede utilizar Web Developer add on para Firefox:

https://addons.mozilla.org/en-US/firefox/addon/60

Instalar este complemento en & elegir la opción "Desactivar caché". Recuerde, eso desactivará el almacenamiento en caché para todos los sitios web.

15

¿No podemos utilizar un filtro como este?

class CacheFilters{ 

    def filters = { 
     all(controller: '*', action: '*') { 
      before = { 
       ((HttpServletResponse) response).setHeader("Cache-Control", "no-store, no-cache, must-revalidate"); 
      } 
      after = { 

      } 
      afterView = { 

      } 
     } 
    } 

} 
+0

Esta es una solución mucho más sensata y simple. –

+0

¡esta debería ser la respuesta correcta! +1 hombre!¡una buena! –

-1

Por tan sólo con fines de desarrollo intente presionar Ctrl + F5, se actualizará la página y la memoria caché también .. cosas de almacenamiento en caché en la producción y mejora del rendimiento del plugin ui-performance de búsqueda de páginas y complementos de recursos de griales.

Cuestiones relacionadas