Java / Wicket - Как запретить браузерам кэшировать страницы? - PullRequest
7 голосов
/ 17 августа 2010

У меня есть страница Java / Wicket, которая генерирует файл JNLP, который запускает программное обеспечение моей компании.Этот класс по желанию будет принимать некоторые параметры URL и встраивать их в качестве аргументов в JNLP.Когда пользователь запускает этот файл JNLP, клиентское приложение будет выполнять некоторые функции на основе этих параметров.Если клиентское программное обеспечение уже запущено на компьютере, при нажатии на страницу JNLP вместо этого будет попытаться передать эти параметры через удаленный вызов работающему клиенту вместо запуска новой страницы.

В этой части явозникли проблемы.В IE, Firefox и Chrome я мог открыть новый клиент, но попытка снова нажать тот же URL-адрес вместо этого вернула бы файл JNLP.Я обнаружил, что очистка кэша браузера устраняет эту проблему во всех браузерах.Кроме того, я не могу достичь точек останова в классе JNLP, что заставляет меня догадываться, что это скорее проблема с запросом, чем что-то странное с Wicket.

Я поместил следующий код в свой класс страницы, которыйextends org.apache.wicket.markup.html.WebPage :

@Override
protected void setHeaders(WebResponse response) {
    getPageMap().remove(this);
    HttpServletResponse httpServletResponse = response.getHttpServletResponse();
    if (httpServletResponse != null) {
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.addHeader("Cache-Control", "no-cache,no-store,private,must-revalidate,max-stale=0,post-check=0,pre-check=0");
        httpServletResponse.addHeader("Keep-Alive", "timeout=3, max=993");
    }
}

Похоже, это не работает, поскольку Firefox 3.6 по-прежнему кэширует результат.IE 7 будет работать, но только после попытки ссылки я создаю несколько раз.Я не очень разбираюсь в веб-разработке и Wicket, и это для меня в новинку, поэтому, возможно, мне не хватает чего-то простого.

TL; DR: Как мне получить страницу Wicket, чтобы она не кэшировалась наклиентский браузер?

Ответы [ 6 ]

5 голосов
/ 17 августа 2010

Хак, используемый в некоторых внутренних элементах Wicket (см., Например, источник для org.apache.wicket.markup.html.image.NonCachingImage), заключается в добавлении случайного шума в URL.

Обычно, если вы генерируете URL-адреса, которые вызывает браузер, вы можете добавить параметр, игнорируемый веб-приложением, который изменяется случайным образом и обманывает браузер, игнорируя его кэш.

2 голосов
/ 17 августа 2010

Пожалуйста, проверьте следующую страницу: https://web.archive.org/web/20120104201334/http://palisade.plynt.com:80/issues/2008Jul/cache-control-attributes/

Firefox должен учитывать заголовок "Cache-Control".

0 голосов
/ 27 октября 2014

Вы когда-нибудь пытались загружать страницы, используя window.location.replace?

0 голосов
/ 23 января 2014

Калитка 6.11.0: Application.get () getResourceSettings () setDefaultCacheDuration (Duration.NONE)..

0 голосов
/ 23 ноября 2010
response.setHeader( "Expires", "0" );
response.setHeader( "Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, private" );
response.setHeader( "Pragma", "no-cache" );

Это работает с IE, Firefox и т. Д., Единственный браузер, с которым он, конечно, не работает, это konqueror.

0 голосов
/ 17 августа 2010

Я не очень хорошо знаю Wicket, но вы пробовали использовать WebResponse.setLastModifiedTime(Time time)? Я знаю, что FF отправляет заголовок If-Modified-Since, на который ваш сервер отвечает 304 Not Modified или обычным ответом.

Мне кажется естественным, что ваш сервер проверит lastModifiedTime на WebResponse, чтобы принять решение.

Если это не поможет, я бы посоветовал вам получить Firebug для Firefox и взглянуть на запросы и ответы.

...