2011-10-13 51 views
4

我想用renderBinary()定製一些靜態資源的服務。 我想通過控制器提供這些資產,optionaly會檢查 授權並提供相應的文件。 我也想緩存一年的文件,因爲它們從不改變。使用renderBinary當renderBinary響應的緩存

public static void item(String item) { 
      // check authorization ... 
      response.cacheFor("365d"); 
      renderBinary(Play.getFile("static/" + item)); 
    } 

我遇到的問題是,遊戲會自動添加的Etag和 緩存它1小時,因此淨效果是 :

在我的控制器的方法看起來是這樣的firefox在需要的時候重新發送這些文件的請求,只是爲了從播放服務器獲得 304響應。

我知道我可以用nginx作爲前端來實現,但是隻想用 來實現。

回答

1

由於Play中的緩存是服務器緩存,並且瀏覽器必須檢查服務器以瞭解詳細信息(answer 304或項目),所以無法避免304回答。這顯示緩存工作正常,因爲它被緩存並且不會再次檢索。但請記住,緩存可能會丟失(如果該項目是舊的並被緩存策略刪除),然後請求會再次加載該項目。

唯一真正的解決方案是將etags更改爲1年。在application.conf中有一個屬性,http.cacheControl,它可以設置緩存的時間。默認爲1小時,將其設置爲1年,但請注意,這將適用於所有項目(因此,如果您更改了JavaScript文件,例如,更好更改名稱!)

+0

Hi Pere。至少可以通過設置Last-Modified和Expires標頭來避免304,但似乎沒有很好的支持。 許多網站聲稱最大年齡應該這樣做,但我的Firefox似乎忽略它,並重新發出請求... 無論如何,似乎我將不得不自定義播放源或可能嘗試做一個模塊配置緩存...... – user744959

+1

@ user744959是的,我的意思是說,如果你依賴於服務器緩存(你的response.cacheFor),304就會在那裏,因爲你正在創建一個服務器緩存,nto迫使瀏覽器存儲它。您想要的方式(理論上)是我在第二段中所說的,嘗試設置http.cacheControl屬性來延長ETag的使用壽命。 –

+0

好的。我以爲cacheFor只是設置瀏覽器標題,因爲它似乎玩忽略我在控制器中設置的標題。我可以通過使用nginx前端解決它,但似乎爲這樣一個簡單的需要很複雜... – user744959