如何防止Grails缓存旧版本的gsp文件?

12

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

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

有没有办法防止Grails缓存并呈现旧版本的文件?

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

谢谢!

6个回答

16

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

class CacheFilters{

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

            }
            afterView = {

            }
        }
    }

}

这是一个更加明智和简单的解决方案。 - Alex Beardsley

8

看起来没有简单的方法来实现这个,但是需要做的工作不多。我的解决方案是对渲染GSPs的servlet(以及用于非GSP请求的控制器)进行子类化。

以下是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)
}

共享的头部设置代码应该被提取到一个实用类中,而不是像我在这里复制/粘贴。

感谢您提供详细的答案。默认情况下,GSP页面会被缓存多长时间?此外,您建议在生产环境中采取什么措施? - Emmett

3

2

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


1

如果您只是想在开发过程中禁用浏览器缓存,可以使用 Firefox 的 Web Developer 插件:

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

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


-1

仅用于开发目的时,尝试按下ctrl+F5,它将刷新页面和缓存.. 为了在生产中缓存事物并改善页面查找ui-performance插件和grails资源插件的性能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接