Как предотвратить кеширование Grails старых версий файла gsp? - PullRequest
12 голосов
/ 30 августа 2009

Я делаю изменения в /grails-app/views/index.gsp.

Когда я сохраняю файл и обновляю http://localhost:8080/index.gsp в Firefox, я получаю старую версию файла.

Есть ли способ предотвратить кэширование Grails и рендеринг старых версий файла?

(Я попытался перезагрузить сервер и очистить кэш Firefox.)

Спасибо!

Ответы [ 6 ]

15 голосов
/ 15 июня 2011

мы не можем использовать такой фильтр?

class CacheFilters{

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

            }
            afterView = {

            }
        }
    }

}
8 голосов
/ 31 августа 2009

Кажется, нет простого способа сделать это, но это не так много работы. Мое решение подклассов сервлет, который отображает 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>

и вы, вероятно, также захотите сделать то же самое для ответов на основе контроллера, поэтому для этого используйте этот подкласс контроллера:

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, чтобы переопределить обычный bean-компонент Spring:

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

Общий код установки заголовка, вероятно, следует извлечь в служебный класс, а не копировать / вставлять, как я сделал здесь.

3 голосов
/ 14 марта 2012

В Grails есть плагин для управления поведением кэша, который называется Cache Headers: http://grails.org/plugin/cache-headers

2 голосов
/ 30 августа 2009

Убедитесь, что вы работаете в режиме dev (то есть, grails run-app, а не grails test | prod run-app, test и production включат кэширование страниц. Если вы находитесь в режиме dev, попробуйте удерживать клавишу Shift когда щелкните обновление Firefox.

1 голос
/ 31 августа 2009

Если вы просто хотите отключить кеш для браузера во время разработки, вы можете использовать дополнение для веб-разработчика для Firefox:

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

Установите это дополнение и выберите «Отключить кеш». Помните, что это отключит кэширование для всех сайтов.

0 голосов
/ 14 марта 2012

Для целей разработки попробуйте нажать Ctrl + F5, это обновит страницу и кеш тоже .. для кеширования вещей на рабочем месте и повышения производительности плагина просмотра страниц ui-performance и плагинов ресурсов grails.

...