我的模板中有一些这样的代码:
#{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
但它再次给出了关于它是否显示正确或错误图像的不一致结果。
答案 0 :(得分:1)
我能想到的两个选项:
生成唯一编号,并将其作为无用参数附加到图像的URL。例如,“http:// url / application / image?personId = 1&amp; ts = 12314125123”。由于这会在每次生成页面时更改URL,因此浏览器不会点击缓存并且每次都会请求图像。通常,时间戳最适合作为参数。
在提供图像时,找到一些设置“Cache-Control”HTTP响应头参数的方法,其值为“no-cache”。如果您使用自定义servlet来传输图像,这应该非常简单。如果没有,我不确定你如何做到这一点,但也许Play提供了一种方式。
在过去,我通常使用选项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中看到了这个想法。