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

Emm*_*ett 12 grails gsp

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

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

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

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

谢谢!

Vas*_*iyL 15

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

class CacheFilters{

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

            }
            afterView = {

            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Bur*_*ith 8

似乎没有一种简单的方法可以做到这一点,但它没有多少工作.我的解决方案子类化了呈现GSP的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);
   }
}
Run Code Online (Sandbox Code Playgroud)

并且您需要在web.xml中替换原始文件(运行"grails install-templates"并编辑src/templates/war/web.xml):

<servlet>
   <servlet-name>gsp</servlet-name>
   <servlet-class>com.burtbeckwith.CachingPageServlet</servlet-class>
</servlet>
Run Code Online (Sandbox Code Playgroud)

并且您可能也想对基于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);
   }
}
Run Code Online (Sandbox Code Playgroud)

你需要在grails-app/conf/spring/resources.groovy中注册它来覆盖常规的Spring bean:

mainSimpleController(com.burtbeckwith.CachingSimpleGrailsController) {
   grailsApplication = ref('grailsApplication', true)
}
Run Code Online (Sandbox Code Playgroud)

共享头设置代码应该被提取到实用程序类中,而不是像我在这里那样进行复制/粘贴.