Wydaje się, że nie ma prostego sposobu, aby to zrobić, ale to nie jest dużo pracy.Moje rozwiązanie podklasy serwlet, który renderuje GSPs (a także kontroler, który jest używany do non-GSP . kupna)
Tutaj jest podklasą 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);
}
}
i trzeba zastąpić oryginał w web.xml (Uruchom "grails install-szablony" i edytować src/templates/war/web.xml):
<servlet>
<servlet-name>gsp</servlet-name>
<servlet-class>com.burtbeckwith.CachingPageServlet</servlet-class>
</servlet>
i ty pewnie też chcą zrobić to samo dla odpowiedzi opartych na kontroler, tak zrobić, że stosowanie tej podklasy kontrolera:
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);
}
}
i musisz go zarejestrować w grails-app/conf/wiosna/resources.groovy zastąpić regularne Wiosna ziarno:
mainSimpleController(com.burtbeckwith.CachingSimpleGrailsController) {
grailsApplication = ref('grailsApplication', true)
}
Kod wspólnego zestawu nagłówków powinien zostać wyodrębniony do klasy narzędziowej zamiast kopiowania/wklejania, tak jak tutaj.
Dzięki za szczegółową odpowiedź. Jak długo domyślnie buforowane są strony gsp? Ponadto - co poleciłbyś robić w środowisku produkcyjnym? – Emmett