画像を処理するサーブレットがApp Engineにあります。キャッシュ関連のHTTPヘッダーは、App EngineのServletレスポンスでオーバーライドされます。
サーブレットは、HTTPヘッダー値を正しく設定して、イメージをキャッシュする必要があることを示します。しかし、App Engineはこれらのヘッダーをオーバーライドし、画像がキャッシュされないようにします。
以前は同じコードが使用されていましたが、今では機能しません。
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リクエストレスポンスを調べると、レスポンスには次のheaが含まれていますders:あなたが見ることができるように
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が設定されていると)、キャッシングをプライベートに設定するので、ブラウザはキャッシュできますが、中間プロキシサーバーはキャッシュできません。 クッキーは私によっては追加されませんが、Googleアナリティクスのコード(私はページ上でGoogle Analyticsを有効にしました)。
私は間違っていますか?サーブレットの応答を適切にキャッシュするにはどうすればよいですか?
EDIT: 詳しい調査の結果、私はGoogleの認証を使用して、ユーザーが彼/彼女のGoogleアカウントを使ってログインしている場合は、ユーザーに関連するクッキーは当然のことながら、追加されるため、クッキーが要求に追加されていることを示しました。ユーザーがログインしていない場合、キャッシュは無効になりません。だから私のさらなる質問は:ユーザーがGoogleアカウントでログインしているときにサーブレットが提供する画像をキャッシュする方法はありますか?
編集:解決: Google App Engineは、アプリの管理者がクライアントの場合にのみキャッシュを無効にします。この場合、App Engineは自動的に、管理者専用のヘッダーを挿入します(たとえば、リクエストの見積もりコストなど)。これはプライベートな情報なので、キャッシングが無効になっていることは分かります。
これは25時間です。 max-ageは秒を指定します。 90000sec = 1500min = 25時間 – NagyI
@NagyIそう、それはタイプミスだった。 – icza