2008-09-24 32 views
3

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

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

Любые идеи о том, как настроить Jersey/Jetty для этого? Или единственный способ настроить его на стороне клиента?

ответ

2

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

2

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

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=» + (новая дата()) GetTime(). Таким образом, запрос url каждый раз отличается, и его нельзя кэшировать.

3

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

+14

Итак, что это за * правильный способ? – ampersandre 2011-09-14 21:24:08

0

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

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

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