Заголовки HTTP, связанные с кэшем, переопределяются в ответе сервлета на App Engine
У меня есть сервлет на движке приложений, который обслуживает изображения.
Сервлет правильно устанавливает значения заголовка HTTP, чтобы указать, что изображения должны быть кэшированы. Но App Engine переопределяет эти заголовки, в результате чего изображения не кэшируются.
Обратите внимание, что тот же код работал раньше, но это не такне работает в течение некоторого времени
Документация движка приложения гласит, что если,Cache-Control
Expires
а такжеVary
заголовки задаются сервлетом, они останутся неизменными:https://developers.google.com/appengine/docs/java/runtime#Responses
Это мой пример кода:
response.setContentType( "image/jpeg" );
//response.setDateHeader( "Expires", new Date().getTime() + 60L*24*60*60*1000 ); // 60 days cache time
//response.addHeader( "Cache-Control", "public, max-age=5184000" ); // 5_184_000 sec = 60 days cache time
response.addHeader( "Cache-Control", "public, max-age=90000" ); // 90_000 sec = 25 hours cache time
response.getOutputStream().write( data ); // Data is a byte array containing the JPEG image data
(Я'Мы постарались поместить все, что закомментировано.)
Изучая HTTP-запрос-ответ, ответ содержит следующие заголовки:
HTTP/1.1 200 OK
status: 200 OK
version: HTTP/1.1
cache-control: public, max-age=90000
cache-control: no-cache, must-revalidate
content-length: 6777
content-type: image/jpeg
date: Sat, 05 Jan 2013 14:11:47 GMT
expires: Fri, 01 Jan 1990 00:00:00 GMT
pragma: no-cache
server: Google Frontend
Как видите, App Engine вставляет,cache-control
expires
а такжеpragma
Заголовки отключают кеширование. Обратите внимание, что это связано с тем, что запрос имеетcookie
заголовок. Но и документация наhttps://developers.google.com/appengine/docs/java/runtime#Responses заявляет, что в этом случае (когда установлен cookie), движок приложения настроит кэширование как частное, так что браузеры все еще смогут его кэшировать, но не промежуточные прокси-серверы. Я не добавляю файлы cookie, но код Google Analytics (явключили Google Analytics на странице).
Что я делаю неправильно? Как я могу добиться правильного кэширования ответа сервлета?
РЕДАКТИРОВАТЬ: Дальнейшее расследование показало, что файлы cookie добавляются в запросы, потому что я использую аутентификацию Google, и если пользователь входит в систему, используя свою учетную запись Google, файлы cookie, связанные с пользователем, по понятным причинам добавляются. Если ни один пользователь не вошел в систему, кэширование не отменяется. Поэтому мой следующий вопрос: существует ли способ кэширования изображений, обслуживаемых сервлетами, когда пользователь входит в систему с учетной записью Google?
РЕДАКТИРОВАТЬ, РЕШЕНИЕ: Google App Engine отключает кэширование, только если клиентом является пользователь-администратор приложения. В этом случае App Engine автоматически вставляет заголовки, предназначенные только для администратора, например примерную стоимость запроса. Это личная информация, поэтому понятно, что кэширование отключено.