2009-08-30 9 views

risposta

8

Non sembra esserci un modo semplice per farlo, ma non è molto utile La mia soluzione sottoclasse il servlet che esegue il rendering dei GSP (e anche il controller utilizzato per i non-GSP .) richieste

Ecco la sottoclasse servlet:

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); 
    } 
} 

e di cui ha bisogno per sostituire l'originale in web.xml ("graal installare-modelli" esecuzione e modificare src/templates/guerra/web.xml):

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

e avrete probabilmente vogliono anche fare lo stesso per le risposte controller-based, in modo da fare che uso questo controller sottoclasse:

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); 
    } 
} 

e avrete bisogno di registrarlo in graal-app/conf/primavera/resources.groovy per ignorare il normale primavera bean:

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

Il codice di impostazione dell'intestazione condivisa dovrebbe probabilmente essere estratto in una classe di utilità invece di essere copia/incollato come ho fatto qui.

+0

Grazie per la risposta dettagliata. Per quanto tempo le pagine gsp sono memorizzate nella cache per impostazione predefinita? Inoltre, cosa consiglieresti di fare per gli ambienti di produzione? – Emmett

2

Assicurati di essere in esecuzione in modalità dev (ad esempio, grails run-app e non grails test | prod run-app, test e produzione abiliteranno il caching delle pagine. Se sei in modalità dev, prova a tenere premuto il turno tasto quando si fa clic sull'aggiornamento di Firefox

1

Se si vuole semplicemente disattivare la cache per il browser durante lo sviluppo, è possibile utilizzare Web Developer add on per Firefox:

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

Installare questo add on & scegliere "la cache Disabilita". Ricorda che disabiliterà la memorizzazione nella cache di tutti i siti Web.

15

non possiamo usare un filtro come questo?

class CacheFilters{ 

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

      } 
      afterView = { 

      } 
     } 
    } 

} 
+0

Questa è una soluzione molto più sana e semplice. –

+0

questa dovrebbe essere la risposta giusta! +1 uomo!una buona! –

-1

Per soli scopi di sviluppo provare a premere CTRL + F5, si aggiorna la pagina e la cache troppo .. per le cose di caching sulla produzione e sul miglioramento delle prestazioni del plug-in ui-performance e delle risorse dei grails per la ricerca della pagina.

Problemi correlati