Как предотвратить кэширование браузера с помощью Play?


Часть моего приложения предоставляет файл для загрузки с помощью метода redirect(). Я обнаружил, что Chrome (а не Firefox или IE, как ни странно) кэширует этот файл, так что одна и та же версия загружается, даже если она изменилась на стороне сервера. Я полагаю, что есть способ сказать браузеру не кэшировать файл, например, , как это в HTML, или добавив что-то в заголовок HTTP. Я мог бы, вероятно, вычислить их в веб-фреймворке более низкого уровня, но я не знаю, как добраться до заголовка в игре!, и опция HTML не будет работать, потому что это не HTML-файл.

Кажется, что всегда есть умный и простой способ делать общие задачи в игре!, так есть ли умный и простой способ предотвратить кэширование в контроллере?

Спасибо!

Правка:

Мэтт указывает мне на http.cacheControl Настройка , которая управляет кэшированием для всего сайта. Хотя это будет работать, у меня нет проблем с кэшированием большей части сайта, особенно CSS и т. д. Если бы это было возможно, я бы ... например, управлять кэшированием для одного URL-адреса за раз (в данном случае указывающего на загружаемый файл). Это точно не будет сайт с высоким трафиком, так что это просто академический интерес.

В идеале я хотел бы сделать что-то вроде:

public static void downloadFile(String url) {
  response.setCaching(false);  // This is the method I'm looking for
  redirect(url);  // Send the response
}
4 9

4 ответа:

Play framework response объект имеет метод setHeader. Вы можете добавить нужные заголовки следующим образом, например:

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

Я не проверял его, но похоже, что http.cacheControl настройка конфигурации может сработать.

Http.cacheControl

Управление заголовками ответов HTTP для статических файлов: устанавливает максимальный возраст по умолчанию в секундах, сообщая браузеру пользователя, как долго он должен кэшировать страницу. Это читается только в режиме prod, в режиме dev кэш отключен. Например, чтобы отправить no-cache:

http.cacheControl=0

Default: 3600 – установить срок действия кэша равным одному часу.

На самом деле это так:

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

Ответ Томми в порядке, но чтобы убедиться, что он работает в каждом браузере, используйте:

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