播放框架和图像缓存

时间:2011-12-21 02:08:51

标签: java caching playframework

我的模板中有一些这样的代码:

#{list people, as:'person'}
    <img src="@@{Application.image(person.id)}">
#{/list}

启动播放服务器后,列表会多次显示第一张图像。因此,例如,如果people变量包含1,2,3,4,5的ID,那么将显示五个图像,但它们都是相同的图像:对应于id为1的图像的图像。

如果我点击刷新,图像全部会根据其ID变为唯一。从模板呈现的html如下所示:

<img src="http://url/application/image?personId=1"/>
<img src="http://url/application/image?personId=2"/>
<img src="http://url/application/image?personId=3"/>
<img src="http://url/application/image?personId=4"/>
<img src="http://url/application/image?personId=5"/>

如何阻止模板第一次显示相同的图像?

编辑:还尝试在我的控制器中的renderBinary(image)调用之前添加下面看到的响应头,以响应src请求:

...
response.setHeader("Pragma-directive", "no-cache");
response.setHeader("Cache-directive", "no-cache");
response.setHeader("Cache-control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0");
renderBinary(imageFile);

根据this帖子。它实际上是前几次工作但是第三次​​停止并启动Play服务器之后,我遇到了相同的缓存问题,尽管有不同的personIds,所有图像都显示相同的图像。我还将时间戳附加到网址的末尾而没有任何运气。

编辑#2:我还尝试在application.conf中将http.cacheControl属性更改为0:

http.cacheControl=0

但它再次给出了关于它是否显示正确或错误图像的不一致结果。

2 个答案:

答案 0 :(得分:1)

我能想到的两个选项:

  1. 生成唯一编号,并将其作为无用参数附加到图像的URL。例如,“http:// url / application / image?personId = 1&amp; ts = 12314125123”。由于这会在每次生成页面时更改URL,因此浏览器不会点击缓存并且每次都会请求图像。通常,时间戳最适合作为参数。

  2. 在提供图像时,找到一些设置“Cache-Control”HTTP响应头参数的方法,其值为“no-cache”。如果您使用自定义servlet来传输图像,这应该非常简单。如果没有,我不确定你如何做到这一点,但也许Play提供了一种方式。

  3. 在过去,我通常使用选项1,因为它几乎总是容易多了。少数民族居住区,但它的确有效。

答案 1 :(得分:1)

我不确定这是否是一个可行的解决方案,但我现在有一个解决办法似乎有用(好吧,它还没有失败),做这些事情:

  • 在Controller

    中的renderBinary(...)调用之前设置缓存控制

    response.setHeader("Cache-Control", "no-cache");

  • 将要渲染的文件转换为FileInputStream,并将其直接传递给renderBinary(...)方法而不是文件。

像这样:

File fileImage = ... // some .png image
FileInputStream stream = new FileInputStream(fileImage);
renderBinary(stream);

我从关于缓存和渲染二进制文件的bug report中看到了这个想法。