Playframework 渲染响应的缓存

Playframework 渲染响应的缓存,playframework,Playframework,我正在尝试使用renderBinary()定制一些静态资源的服务。 我想通过控制器提供这些资产,该控制器可进行选择性检查 授权并提供适当的文件。 我还想缓存一些文件1年,因为它们永远不会改变 控制器中的方法如下所示: public static void item(String item) { // check authorization ... response.cacheFor("365d"); re

我正在尝试使用renderBinary()定制一些静态资源的服务。 我想通过控制器提供这些资产,该控制器可进行选择性检查 授权并提供适当的文件。 我还想缓存一些文件1年,因为它们永远不会改变

控制器中的方法如下所示:

    public static void item(String item) { 
             // check authorization ... 
             response.cacheFor("365d"); 
             renderBinary(Play.getFile("static/" + item)); 
    } 
我遇到的问题是,play会自动添加Etag和 使用renderBinary时将其缓存1小时,因此最终效果是 firefox在需要时再次发出对这些文件的请求,只是为了 304来自播放服务器的响应

我知道我可以用nginx作为前端来完成这件事,但我很想这样做
仅使用播放。

您无法避免304答案,因为播放中的缓存是服务器缓存,浏览器必须检查服务器以了解详细信息(答案304或项目)。这表明缓存工作正常,因为它已被缓存,不再被检索。但是请记住,该缓存可能会丢失(如果该项是旧的并且已通过缓存策略删除),然后请求将再次加载该项


唯一真正的解决办法是将ETAG更改为1年。application.conf中有一个属性http.cacheControl,可以设置缓存的时间。默认值为1小时,设置为1年,但请注意这将适用于所有项目(因此,如果您更改javascript文件,最好也更改名称!)

这是一个已知的错误,请参阅。您至少可以通过设置Last Modified和Expires头来避免304,但这方面似乎没有很好的支持。许多网站声称max age也应该这样做,但我的firefox似乎忽视了这一点,并重新发出了请求。。。无论如何,似乎我必须自定义plays源代码,或者尝试创建一个用于配置缓存的模块…@user744959是的,我的意思是,如果您依赖于服务器缓存(您的响应.cacheFor),当您创建服务器缓存时,304将在那里,以强制浏览器存储它。您想要的方式(理论上)是我在第二段中所说的,尝试设置http.cacheControl属性来扩展ETag life.ok。我认为cacheFor只是设置浏览器标题,因为play似乎忽略了我在controller中设置的标题。我可以通过使用nginx前端来解决这个问题,但对于这样一个简单的需求来说似乎过于复杂了……我最近发现了相同的错误报告,并找到了一个解决方法,返回FileInputStream而不是file。。