我正在修改/grails-app/views/index.gsp。
当我保存文件并在Firefox中刷新http://localhost:8080/index.gsp时,我收到了该文件的旧版本。
有没有办法阻止Grails缓存并渲染旧版本的文件?
(我尝试重新启动服务器并清除Firefox的缓存。)
谢谢!
答案 0 :(得分:15)
我们不能使用这样的过滤器吗?
class CacheFilters{
def filters = {
all(controller: '*', action: '*') {
before = {
((HttpServletResponse) response).setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
}
after = {
}
afterView = {
}
}
}
}
答案 1 :(得分: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);
}
}
你需要在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 :(得分:3)
有一个用于控制Grails中缓存行为的插件,名为Cache Headers: http://grails.org/plugin/cache-headers
答案 3 :(得分:2)
确保您以开发模式运行(即,grails run-app而不是grails test | prod run-app,测试和生产将启用页面缓存。如果您处于开发模式,请尝试按住shift键点击Firefox刷新时。
答案 4 :(得分:1)
如果您只是想在开发时为浏览器禁用缓存,可以使用Web Developer为Firefox添加:
https://addons.mozilla.org/en-US/firefox/addon/60
在&amp;上安装此添加选择“禁用缓存”。请记住,这将禁用所有网站的缓存。
答案 5 :(得分:-1)
仅出于开发目的,请按ctrl + F5,它将刷新页面和缓存...用于缓存生产中的内容并提高页面查找ui-performance插件和grails资源插件的性能。