2012-06-21 9 views
5

現時点では、私のジャージーの安らかなサービスのキャッシングを有効にしようとしています。EntityTag - 価値、キャッシング、比較 - ジャージーの方法

質問があります。

  1. entityTagの値はどのくらいですか?一意の生成されたランダムな文字列にすることはできますか?

  2. クライアントからサーバーへの投稿要求を行うと、エンティティタグを使用して返信が返されます。質問:これをキャッシュする方法と、キャッシュされたentityTagを次のリクエストのために送信する必要があることをどのように知っていますか?

  3. サーバー側では、送信されたentityTagを取得します。これをどのようにリソースと比較すればよいですか?私はエンティティタグをressourceに添付しなかったので。

  4. ちょうどエンティティタグを比較しています。では、最後に変更されたヘッダー値はいつ必要ですか?

申し訳ありませんが、サーバー側とクライアント側の例を取得するとよいでしょう。私はこの問題のために何も見つけることができません。リクエストでentityTagsを送信する方法、サーバー側でそれらを比較する方法、および最後に変更されたaboutsについて

答えて

7

ETagsは、キャッシュされたコンテンツがまだ最新であるかどうかを検証するためのクライアントキャッシュのメカニズムを提供します。ご質問に関して:サーバーへの最大

  1. 決定する - それが一意(リソースのリビジョン番号、またはリソース表現のCRC32ハッシュすることができ、時間のある時点でのリソースのバージョンを確認する必要があります、またはリソースが変更されているかどうかを判断するために使用できる他のもの)
  2. ジャージーは現時点でクライアント側のキャッシュをサポートしていません。クライアントリクエストをインターセプトするClientFilterを実装して独自のキャッシュを作成し、URI、メディアタイプ、およびリクエストメソッドをキャッシュされたレスポンスにマップする内部HashMap(たとえば)を調べます。そのキャッシュされた応答からETagを取り出し、それをクライアント要求に添付します。サーバが応答すると、フィルタはサーバが304(Not Modified)ステータスコードで応答したかどうかをチェックし、そうであればフィルタは以前にキャッシュされた応答をクライアントに返し、そうでなければサーバから返された応答をキャッシュし、クライアント。
  3. リクエストでエンティティタグを送信することによって、クライアントは基本的に次のように言います。「このエンティティタグに対応するエンティティのバージョンがありますか?エンティティは同じですか、変更されていますか?新しいバージョンのエンティティとタグ! "サーバーが最初の応答でエンティティタグを送信しなかった場合、クライアントはキャッシュされたエンティティに対応するタグを認識しないため、要求にタグを送信できません。サーバーはタグの意味を知っています。クライアントの場合、タグ値は不透明です。
  4. いずれか一方または両方を指定できます。

サーバー側では、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

+1

この例ではrequest.evaluatePreconditions(ら)を持つべきではありません。 ? – Alb

関連する問題