ETagは、キャッシュされたコンテンツがまだ最新であるかどうかを検証するためのクライアントキャッシュのメカニズムを提供します。あなたの質問について:
- 決定するサーバー次第-特定の時点でのリソースのバージョンを一意に識別する必要があります(リソースのリビジョン番号、リソース表現のCRC32ハッシュ、または決定に使用できるその他のものにすることができます)。リソースが変更されたかどうか)
- 現在、Jerseyはクライアント側のキャッシュをサポートしていません。クライアントリクエストをインターセプトし、URI、メディアタイプ、リクエストメソッドをキャッシュされたレスポンスにマップする内部HashMap(たとえば)を調べるClientFilterを実装することで、独自のキャッシュを作成できます。キャッシュされた応答からETagを取得し、それをクライアントリクエストに添付します。サーバーが応答すると、フィルターはサーバーが304(未変更)ステータスコードで応答したかどうかを確認します。応答した場合、フィルターは以前にキャッシュされた応答をクライアントに返します。そうでない場合は、サーバーから返された応答をキャッシュして、クライアント。
- リクエストでエンティティタグを送信すると、クライアントは基本的に次のように言います。「このエンティティタグに対応するエンティティのバージョンがあります。エンティティは同じですか、それとも変更されていますか?変更されている場合は、新しいバージョンを送信してください。タグと一緒にエンティティ!」サーバーが最初の応答でエンティティタグを送信しなかった場合、クライアントはキャッシュされたエンティティに対応するタグを認識しないため、要求でタグを送信できません。サーバーはタグの意味を認識しています。クライアントの場合、タグの値は不透明です。
- どちらか一方または両方を使用できます。
サーバー側では、JerseyはETagの評価と応答の生成をサポートしています。たとえば、リソースメソッドは次のようになります。
@GET
public Response doGet() {
EntityTag et = yourMethodForCalculatingEntityTagForThisResource();
// the following method call will result in Jersey checking the headers of the
// incoming request, comparing them with the entity tag generated for
// the current version of the resource generates "304 Not Modified" response
// if the same. Otherwise returns null.
ResponseBuilder rb = request.evaluatePreconditions(new EntityTag("1"));
if (rb != null) {
// Jersey generated 304 response - return it
return rb.build();
}
// return the current version of the resource with the corresponding tag
return Response.ok(getCurrentVersion(), "text/plain").tag(et).build();
}
同じ種類のサポートが、最終変更されたヘッダーと、etagと最終変更の両方に提供されます。
このウィキペディアの記事は、ETagの概要を示しています:http://en.wikipedia.org/wiki/HTTP_ETag