【问题标题】:How to prevent Grails from caching old versions of gsp file?如何防止 Grails 缓存旧版本的 gsp 文件?
【发布时间】:2009-08-30 05:29:23
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: grails gsp


    【解决方案1】:

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

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

    【讨论】:

    • 这是一个更加理智和简单的解决方案。
    【解决方案2】:

    似乎没有一种简单的方法可以做到这一点,但工作量不大。我的解决方案将呈现 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)
    }
    

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

    【讨论】:

    • 感谢您的详细解答。 gsp页面默认缓存多长时间?另外——您会建议在生产环境中做什么?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-09
            • 2014-05-09
            • 2019-05-04
            • 2015-12-18
            • 1970-01-01
            • 2016-10-26
            • 1970-01-01
            相关资源
            最近更新 更多