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.
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