2010-08-04 63 views
15

我有一個GWT應用程序部署到我們客戶的機器上。作爲一個正在進行的 開發,我們必須不時發佈新的改進版本的 應用程序。每次我們發佈一個新版本時,我們通常會遇到這樣的問題:客戶端的瀏覽器已經緩存了 舊腳本腳本,並且一段時間它的行爲蠻橫,因爲它嘗試使用的數據與它不兼容。什麼是 克服這個問題的最好方法。目前,我必須告訴用戶 要清除瀏覽器的緩存以獲得新版本,但它不會那麼做,因此 不需要這樣做。在GWT App中停止瀏覽器腳本緩存

回答

14

默認情況下,應用程序的大部分應由瀏覽器緩存,直到構建過程生成新版本的應用程序。

這可能有助於理解GWT引導模型,以瞭解其工作原理。

您的客戶端請求的第一個腳本your-app-name.nocache.js未被緩存,除了檢查瀏覽器的用戶代理和功能並且爲相關應用程序JS發出第二個請求外,它什麼也不做。

在這一點上,它所請求的腳本應該被瀏覽器緩存,如果之前已經被請求的話。這是一個{indistinguisable-numbers-and-letters}.cache.html文件。

當您重新部署應用程序時,將會執行nocache.js文件並向服務器索要不同的cache.html文件,該文件不會存在於緩存中,但是一旦下載,該文件就會被瀏覽器緩存。

你是否在做任何與延遲綁定或服務器緩存頭文件不同的事情?這可能會導致您的nocache.js文件被緩存,這將使其從瀏覽器緩存中請求舊的cache.html

+2

Jason,它看起來像是你的app-name.nocache.js緩存在瀏覽器中的副作用。 Shahid必須將其服務器配置爲僅緩存* .cache.js並且不緩存* .nocache.js。 除了你提到的所有東西都應該自動落實到位。 – 2010-08-05 07:00:44

+0

@ jason-hall關於如何向通過your-app-name.nocache.js加載的腳本的url注入一些散列的任何想法?在我的情況下,your-app-name.nocache.js在沒有緩存的情況下被正確加載,但作爲其結果加載的腳本仍然來自緩存。我想在每個構建生成一個哈希,並將其添加到網址... – Mabedan 2017-06-09 16:18:15

15

可能的解決方案取決於您託管應用程序的方式。如果您是直接從servlet容器託管,那麼你可以使用Servlet過濾器像這裏所描述的:

http://seewah.blogspot.com/2009/02/gwt-tips-2-nocachejs-getting-cached-in.html

下面是tadedon庫適當的過濾器:

http://code.google.com/p/tadedon/source/browse/tadedon-servlet/src/main/java/com/xemantic/tadedon/servlet/CacheDisablingFilter.java

http://code.google.com/p/tadedon/source/browse/tadedon-servlet/src/main/java/com/xemantic/tadedon/servlet/CacheForcingFilter.java

這裏是guice ServletModule,它使它們可以用於整個guice web應用程序:

http://code.google.com/p/tadedon/source/browse/tadedon-gwt/src/main/java/com/xemantic/tadedon/gwt/http/GwtHttpCachingModule.java

如果您正在使用Tomcat中這將是更簡單的前一些反向代理。在apache(例如mod_proxy,mod_jk)的情況下,並假設所有的應用程序資源(html,圖形,java腳本,css等等在 「完美緩存」 部分

http://code.google.com/webtoolkit/doc/latest/DevGuideCompilingAndDebugging.html

:)都穿上了Apache,只需設置在Apache配置這些選項:

<Files *.nocache.*> 
    ExpiresDefault "access" 
</Files> 

<Files *.cache.*> 
    ExpiresDefault "now plus 1 year" 
</Files> 

在此描述。這種部署方案假定只有rpc請求應該通過反向代理到tomcat。如果由於某些原因,所有的應用程序上下文都被代理到tomcat,你仍然可以使用Apache的LocationMatch指令而不是Files指令。