Как запретить Grails кэшировать старые версии gsp файла?

Я вношу изменения в /grails -app/views/index.gsp.

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

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

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

Спасибо!

Ответ 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)
}

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

Ответ 2

Нельзя ли использовать такой фильтр?

class CacheFilters{

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

            }
            afterView = {

            }
        }
    }

}

Ответ 3

Там плагин для управления поведением кэша в граале, называемом заголовками кэша: http://grails.org/plugin/cache-headers

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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