ETagsは、キャッシュされたコンテンツがまだ最新であるかどうかを検証するためのクライアントキャッシュのメカニズムを提供します。ご質問に関して:サーバーへの最大
- 決定する - それが一意(リソースのリビジョン番号、またはリソース表現のCRC32ハッシュすることができ、時間のある時点でのリソースのバージョンを確認する必要があります、またはリソースが変更されているかどうかを判断するために使用できる他のもの)
- ジャージーは現時点でクライアント側のキャッシュをサポートしていません。クライアントリクエストをインターセプトするClientFilterを実装して独自のキャッシュを作成し、URI、メディアタイプ、およびリクエストメソッドをキャッシュされたレスポンスにマップする内部HashMap(たとえば)を調べます。そのキャッシュされた応答からETagを取り出し、それをクライアント要求に添付します。サーバが応答すると、フィルタはサーバが304(Not Modified)ステータスコードで応答したかどうかをチェックし、そうであればフィルタは以前にキャッシュされた応答をクライアントに返し、そうでなければサーバから返された応答をキャッシュし、クライアント。
- リクエストでエンティティタグを送信することによって、クライアントは基本的に次のように言います。「このエンティティタグに対応するエンティティのバージョンがありますか?エンティティは同じですか、変更されていますか?新しいバージョンのエンティティとタグ! "サーバーが最初の応答でエンティティタグを送信しなかった場合、クライアントはキャッシュされたエンティティに対応するタグを認識しないため、要求にタグを送信できません。サーバーはタグの意味を知っています。クライアントの場合、タグ値は不透明です。
- いずれか一方または両方を指定できます。
サーバー側では、JerseyはETagsの評価と応答の生成をサポートしています。例えば。リソース・メソッドは次のようになります。サポートの
@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と最終更新の両方のために提供されます。
このWikipediaの記事は、てETagの素敵な概観を提供します。http://en.wikipedia.org/wiki/HTTP_ETag
この例ではrequest.evaluatePreconditions(ら)を持つべきではありません。 ? – Alb