5

現時点では、ジャージのRESTfulサービスのキャッシュを有効にしようとしています。

それで、いくつかの質問が発生しました。

  1. entityTagの値は何ですか?一意に生成されたランダムな文字列である可能性はありますか?

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

  3. サーバー側では、送信されたentityTagを取得します。これをリソースと比較するにはどうすればよいですか?entityTagをリソースに添付しなかったためです。

  4. それはentityTagsを比較することだけです。では、最後に変更されたヘッダー値はいつ必要ですか?

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

4

1 に答える 1

8

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

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

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

于 2012-06-22T08:54:23.323 に答える