如何在 Play 中避免浏览器缓存?

9
我的应用程序的一部分提供了一个使用redirect()方法下载文件的功能。我发现Chrome(但奇怪的是不包括Firefox或IE)会缓存此文件,因此即使服务器端更改了该文件,也会下载相同的版本。我知道有一种方法可以告诉浏览器不要缓存文件,例如在HTML中使用像这样,或者添加一些HTTP头信息。在低级Web框架中,我可能可以解决这些问题,但我不知道如何在Play!中获取头信息,而HTML选项无法正常工作,因为它不是HTML文件。
在Play!中,似乎总是有聪明和简单的方法来完成常见任务,那么是否有一种聪明而简单的方法来防止控制器中的缓存?
谢谢!
编辑:
Matt指向http.cacheControl设置,它控制整个站点的缓存。虽然这将起作用,但我对大多数网站被缓存没有问题,尤其是CSS等。如果可能的话,我想逐个URL控制缓存(在本例中指向下载文件的URL)。这不是一个高流量的站点,所以这只是学术兴趣在说话。
理想情况下,我希望能够做到以下事情:
public static void downloadFile(String url) {
  response.setCaching(false);  // This is the method I'm looking for
  redirect(url);  // Send the response
}
6个回答

10

Play框架response对象有一个setHeader方法。你可以像这样添加自己想要的头部:

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

6

我没有测试过,但看起来http.cacheControl配置设置可能会起作用。

http.cacheControl

HTTP Response headers control for static files: sets the default max-age in seconds, telling the user’s browser how long it should cache the page. This is only read in prod mode, in dev mode the cache is disabled. For example, to send no-cache:

http.cacheControl=0

Default: 3600 – set cache expiry to one hour.


好的,我会试一下。老实说,我很少测试我的答案,所以不用担心 :D。看起来正是我需要的! - andronikus
那样会为整个网站设置缓存参数。虽然这样可以工作,但我想告诉浏览器不要缓存特定的URL(在这种情况下,指向该文件的URL)。我将把它添加到我的问题中。 - andronikus

2

实际上是这样的:

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

在Play的较新版本中,play.mvc.Controller中已经没有称为response的对象,而是使用response()函数。 - oman.ispace

2

Tommi的回答是正确的,但为了确保它在每个浏览器中都能正常工作,请使用以下代码:

response().setHeader("Cache-Control", "no-cache, max-age=0, must-revalidate, no-store");

0
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0, s-maxage=0"); // HTTP 1.1.

请编辑您的答案,包括解释这是如何运作的以及为什么它是问题描述中的解决方案。请参见[答案]。 - Yunnosch

0

在目前的2.5.x至2.8.x版本上, 您可以在配置中设置资产文件夹或资产文件的缓存生命周期。

对于文件夹-

play.assets.cache."/public/stylesheets/"="max-age=100"
play.assets.cache."/public/javascripts/"="max-age=200"

针对特定文件 -

play.assets.cache."/public/stylesheets/bootstrap.min.css"="max-age=3600"

--- 文档 https://www.playframework.com/documentation/2.8.x/AssetsOverview


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接