Отключение клиентского кэша с сервера Jetty для запросов REST - PullRequest
3 голосов
/ 24 сентября 2008

У меня есть REST Java-сервер, реализованный с использованием Джерси на Jetty. Кажется, что некоторые браузеры (IE7) внутренне кэшируют все запросы, сделанные к серверу.

То, что я хотел бы сделать, это отправить определенный HTTP-заголовок в ответе от сервера REST, указывающий браузеру, что он не должен кэшировать этот ответ, и поэтому снова запросит сервер в следующий раз, когда ему потребуется доступ к этому ресурс.

Есть идеи, как настроить Джерси / Джетти для этого? Или единственный способ настроить это на стороне клиента?

Ответы [ 4 ]

3 голосов
/ 04 октября 2008

response.setHeader ("Pragma", "no-cache");

Нет, нет. Нет!

Использование заголовка прагмы для отключения кэширования на стороне клиента является неправильным, это заголовок запроса, который имеет ноль влияния на ответ.

http://www.mnot.net/cache_docs/#PRAGMA

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32

Кроме того, настройка Expires: 0 неверна, Expires должна быть датой, а не числом секунд, однако это будет работать, так как неверная дата http интерпретируется как "уже истекла"

http://www.mnot.net/cache_docs/#EXPIRES

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21

2 голосов
/ 24 сентября 2008

На стороне сервера вы можете попробовать это, если у вас есть доступ к ответу (вы могли бы сделать это через фильтры).

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

Еще одна хитрость, которую вы можете попробовать на стороне клиента, - добавить лишний аргумент к URL-адресу, например "http://www.company.com/services/staff?id=xxx&requestTime="+(new Date ()). GetTime (); Таким образом, запрашиваемый URL-адрес каждый раз отличается, и это невозможно кэшировать.

2 голосов
/ 24 сентября 2008

Вы ничего не можете сделать с мошенническими клиентами, но Jetty может отправлять соответствующие HTTP-заголовки. Попробуйте здесь для получения информации о настройке заголовков Last-Modified и Cache-Control.

0 голосов
/ 02 февраля 2010

@ Дейв Чейни: ну, из http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 я понимаю, что Cache-control имеет смысл как для запроса, так и для ответа. А когда ответ является ответом, управляемым кешем, это спецификация того, что клиент (браузер) должен делать с ресурсом (см. Следующий раздел, 14.9.1).

@ all: Кроме того, в разделе 14.21 того же документа указано, что заголовок Expires, установленный в 0, означает «недопустимая дата» и может игнорироваться клиентами. И мои тесты с отправкой даты истечения срока до 1 января 1970 года (отметка времени 0) не вызывают ничего, кроме игнорирования в IE (и ff в этом отношении), который все равно будет кэшировать ответ.

Мое решение состояло в том, чтобы отправить текущую дату в поле Expires, что и указано в спецификации.

...