6

画像を提供する App Engine にサーブレットがあります。

サーブレットは HTTP ヘッダー値を適切に設定して、画像をキャッシュする必要があることを示します。ただし、App Engine はこれらのヘッダーをオーバーライドするため、画像がキャッシュされません。

以前は同じコードが機能していましたが、現在は機能していないことに注意してください。

App エンジンのドキュメントにはCache-ControlExpiresおよび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し、ヘッダーはキャッシュexpirespragma無効にします。これは、リクエストにcookieヘッダーがあるためです。しかし、 https://developers.google.com/appengine/docs/java/runtime#Responsesのドキュメントにも、 この場合 (Cookie が設定されている場合)、App Engine はキャッシュを非公開に構成するため、ブラウザーは引き続きアクセスできると記載されています。それをキャッシュしますが、中間プロキシ サーバーではありません。Cookie は私が追加したものではなく、Google アナリティクスのコードです (ページで Google アナリティクスを有効にしました)。

私は何を間違っていますか?サーブレット応答の適切なキャッシュを実現するにはどうすればよいですか?

編集: Google認証を使用しているため、さらに調査したところ、Cookieがリクエストに追加され、ユーザーがGoogleアカウントを使用してログインしている場合、ユーザー関連のCookieが追加されることがわかりました. ログインしているユーザーがいない場合、キャッシュは上書きされません。私のさらなる質問は次のとおりです。ユーザーが Google アカウントでログインしているときに、サーブレットが提供する画像をキャッシュする方法はありますか?

編集、解決策: Google App Engine は、アプリの管理者ユーザーがクライアントである場合にのみキャッシュを無効にします。この場合、App Engine は、リクエストの推定コストなど、管理者専用のヘッダーを自動的に挿入します。これは個人情報であるため、キャッシュが無効になっていることは理解できます。

4

1 に答える 1