Как управлять кешем на странице JSP? - PullRequest
4 голосов
/ 23 декабря 2009

Я создал фильтр сервлетов со следующим кодом в doFilter:

HttpServletResponse httpResponse = (HttpServletResponse)response;

httpResponse.setHeader("Cache-Control","no-cache");
httpResponse.setHeader("Pragma","no-cache");
httpResponse.setDateHeader("Expires", 0); 

chain.doFilter(request, response);

Я хочу убедиться, что на клиенте ничего не кэшируется, и каждый запрос (даже тот, что от кнопки возврата браузера) направляется на сервер.

Но даже после реализации вышеуказанного фильтра некоторые страницы кэшируются (доступны с помощью кнопки назад браузера).

И другие страницы, которые не кэшируются, показывают Веб-страница просрочена Ошибка в Internet Explorer.

Ответы [ 4 ]

10 голосов
/ 23 декабря 2009

Для начала, полный набор:

httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpResponse.setDateHeader("Expires", 0); // Proxies.

no-store и must-revalidate необходимы, чтобы заставить его работать под каждым Firefox.

Но даже после реализации вышеуказанного фильтра некоторые страницы кэшируются (доступны с помощью кнопки назад браузера).

Как вы это проверили? Эти заголовки фактически не позволяют браузеру запрашивать страницу из кэша браузера, а не напрямую с сервера. Лучший тест - иметь Filter для прослушивания /* и добавить оператор отладки в виде:

HttpServletRequest httpRequest = (HttpServletRequest) request;
String method = httpRequest.getMethod();
String URI = httpRequest.getRequestURI();
System.out.println(method + " request invoked on " + URI);

Это должно напечатать фактические запросы.

Также убедитесь, что вы не переопределяете заголовки на самой странице JSP с помощью тегов HTML <meta>.

И другие страницы, которые не кэшируются, показывают Веб-страница просрочена Ошибка в Internet Explorer.

Вы можете получить это, только если не кэшированный запрос был POST запросом, а не GET запросом. GET запросы будут просто запрашиваться снова с сервера, а не из кеша браузера.

3 голосов
/ 09 мая 2013

Я нашел это в документах оракула, где говорится, что вы никогда не должны использовать

httpResponse.setDateHeader("Expires", 0);

вместо него вы должны использовать

setDateHeader("Last-Modified", (new Date()).getTime() );

http://docs.oracle.com/cd/E13158_01/alui/wci/docs103/devguide/tsk_pagelets_settingcaching_httpexpires.html

0 голосов
/ 05 февраля 2013

Я нашел эту информацию: http://docs.oracle.com/cd/E19501-01/819-3659/beagw/index.html (см. Тег кеша )

0 голосов
/ 23 декабря 2009

Мы также используем заголовок Last-Modified, чтобы браузер всегда получал новую версию.

setDateHeader("Last-Modified", (new Date()).getTime() ); // Set last modified to right now.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...