Ответ 1
Кажется, что нет простого способа сделать это, но это не так много работает. Мое решение подклассифицирует сервлет, который отображает GSP (а также контроллер, который используется для запросов, отличных от GSP).
Здесь подкласс сервлета:
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);
}
}
и вам нужно будет заменить оригинал в web.xml(запустите "grails install-templates" и отредактируйте src/templates/war/web.xml):
<servlet>
<servlet-name>gsp</servlet-name>
<servlet-class>com.burtbeckwith.CachingPageServlet</servlet-class>
</servlet>
и вы, вероятно, также захотите сделать то же самое для ответов на основе Controller, поэтому для этого используйте этот подкласс контроллера:
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);
}
}
и вам нужно зарегистрировать его в grails-app/conf/ spring/resources.groovy, чтобы переопределить обычный Spring bean:
mainSimpleController(com.burtbeckwith.CachingSimpleGrailsController) {
grailsApplication = ref('grailsApplication', true)
}
Общий код настройки заголовка, вероятно, должен быть извлечен в класс утилиты вместо копирования/вставки, как здесь.