12

我正在修改 /grails-app/views/index.gsp。

当我保存文件并在 Firefox 中刷新http://localhost:8080/index.gsp时,我得到的是旧版本的文件。

有没有办法阻止 Grails 缓存和渲染文件的旧版本?

(我尝试重新启动服务器并清除 Firefox 的缓存。)

谢谢!

4

6 回答 6

16

我们不能使用这样的过滤器吗?

class CacheFilters{

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

            }
            afterView = {

            }
        }
    }

}
于 2011-06-15T10:48:19.023 回答
8

似乎没有一种简单的方法可以做到这一点,但它的工作量并不大。我的解决方案将呈现 GSP(以及用于非 GSP 请求的控制器)的 servlet 子类化。

这是 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);
   }
}

您需要替换 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 中注册它以覆盖常规 Spring bean:

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

共享标头设置代码可能应该被提取到实用程序类中,而不是像我在这里所做的那样被复制/粘贴。

于 2009-08-31T03:07:29.677 回答
3

有一个用于控制 grails 中的缓存行为的插件,称为 Cache Headers: http: //grails.org/plugin/cache-headers

于 2012-03-13T21:55:36.953 回答
2

确保您在开发模式下运行(即 grails run-app 而不是 grails test|prod run-app,测试和生产将启用页面缓存。如果您处于开发模式,请尝试在单击时按住 shift 键火狐刷新。

于 2009-08-30T07:05:31.150 回答
1

如果您只是想在开发时禁用浏览器的缓存,您可以使用 Firefox 的 Web Developer add on:

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

安装此插件并选择“禁用缓存”。请记住,这将禁用所有网站的缓存。

于 2009-08-31T13:25:13.943 回答
-1

仅出于开发目的尝试按 ctrl+F5,它也会刷新页面和缓存.. 用于缓存生产中的内容并提高页面查找 ui-performance 插件和 grails 资源插件的性能。

于 2012-03-14T04:42:48.250 回答