2009-08-30 38 views

回答

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安裝模板」和編輯的src /模板/戰爭/ 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目錄/彈簧將其註冊/ resources.groovy覆蓋普通的Spring豆:

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

共享的頭文件設置代碼可能應該被提取到工具類中,而不是像我在這裏那樣進行復制/粘貼。

+0

感謝您的詳細解答。 gsp頁面默認緩存多久?另外 - 你會推薦爲生產環境做些什麼? – Emmett 2009-08-31 22:35:46

2

確保你在開發模式下運行(例如,grails run-app,而不是grails test | prod run-app,測試和生產將啓用頁面的緩存,如果你處於開發模式,點擊火狐瀏覽器刷新時的關鍵點

1

如果你只是想禁用緩存爲您的瀏覽器而開發,你可以使用Web開發人員添加對Firefox:

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

安裝此插件在&選擇「禁用緩存」。請記住,這將禁用所有網站的緩存。

15

我們不能使用這樣的過濾器嗎?

class CacheFilters{ 

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

      } 
      afterView = { 

      } 
     } 
    } 

} 
+0

這是一個更加理智和簡單的解決方案。 – 2013-08-01 15:26:20

+0

這應該是正確的答案! +1男子!一個好的! – 2014-11-04 07:30:27

-1

對於剛剛發展的宗旨嘗試按CTRL + F5,將刷新頁面,緩存太..緩存的東西在生產和改善頁面查找UI性能插件和grails資源插件的性能。