2016-03-01 52 views
0

爲了優化緩存,我將時間戳添加到圖像的src值等,例如, <img src="/static/img/foo.1456871418309.png"/>.AppEngine:將請求轉發到靜態內容

然後我創建了一個servlet過濾器,它再次刪除時間戳,然後將請求轉發給資源。 request.getRequestDispatcher (urlWithoutTimestamp).forward(request, response)

而在appengine-web.xml我指定緩存一年的文件。

<static-files> 
    <include path="/static/**" expiration="365d" /> 
</static-files> 

這樣,我想,用戶將隨時獲得最新的版本,直到有新版本出現可以緩存它,而不必通過HTTP進行測試。

在本地主機(運行作爲Web應用程序)能正常工作,HTTP響應所期待的緩存頭:

Cache-Control:"public, max-age=31536000" 
Expires:"Wed, 01 Mar 2017 22:54:32 GMT" 

然而,當我部署的應用程序引擎服務器對整個事情的反應有這個緩存頭(沒有「過期」):

Cache-Control:"private" 

而是把請求轉發的,我也打過電話上HttpServletRequestWrapper的FilterChain修改getRequestURI,getRequestURL,getServletPath。這導致了同樣的糟糕結果。

我該如何解決這個問題?

更新:

關於第二個想法,我想轉發到靜態內容是不可能的,因爲轉發總是做本地服務器和靜態內容很可能是另一臺機器上提供服務。

但至少我能夠解決我的HTTP標頭問題,我的過濾器:

  1. 相反轉發請求的,我使用了HttpServletRequestWrapper(見上文),以除去來自該請求的時間戳。
  2. 然後我調用chain.doFilter修改後的請求。
  3. 最後我在響應中設置了緩存標頭。

回答

1

除了更改文件名和使用過濾器,您可以引用實際的靜態文件,並添加時間戳作爲請求參數。

相反的:

<img src="/static/img/foo.1456871418309.png"/> 

使用下面的模式:

<img src="/static/img/foo.png?r=1456871418309"/> 

對於靜態文件,這些參數將被忽略。但對於瀏覽器,每次都會有一個新的URL,因此它將從服務器請求。

+0

這聽起來很不錯!我會盡快嘗試:) (只是爲了更好的理解:它不是當前的時間戳,而是自服務器啓動以來第一次請求時設置爲最終靜態變量的最後一個 - 最好是編譯時的時間戳或部署時間,但不知道如何做到這一點。) – mbee

+0

該值也將工作。你不需要它之間的請求uniq我猜,只是在不同版本的應用程序之間 –

1

在生產中,您將無法攔截靜態文件流量。 Google App Engine負責爲您提供靜態文件,基本上提供了一種CDN。

我引用上https://cloud.google.com/appengine/docs/java/config/webxml#Filters

過濾器上的靜態資產不被調用的說明,即使路徑 過濾器映射模式相匹配。靜態文件直接提供給 瀏覽器。

+0

從我的經驗來看,這不是全部的事實。看起來每個資源都以動態資源和靜態資源的形式存在 - 並且通過應用過濾器,選擇動態資源。我想這不知何故解釋了我的問題:''不適用於我過濾的資源 – mbee

+0

那麼,默認情況下,WAR中的所有文件都被視爲靜態文件和資源文件,JSP文件除外。 (https://cloud.google.com/appengine/docs/java/config/appconfig#Java_appengine_web_xml_Static_files_and_resource_files)。也就是說,在appengine-web.xml文件中靜態定義文件將直接由Google提供,而不會打到你的應用程序。也是資源意味着你也可以通過java.io.File或javax.servlet.ServletContext.getResource/getResourceAsStream來訪問它們。沒有更多的信息,我不知道爲什麼''指令不會在生產中生效。 –

+0

在我看來,''適用於實際存在的文件,例如'foo.png',但轉到應用程序引擎(及其過濾器),如果它們不存在(例如foo.1456871418309.png)。那是對的嗎?然而,一旦在App Engine上似乎沒有辦法回到服務於靜態文件的計算機上... – mbee