http - jersey教學 - servlet restful



EntityTag-價值,緩存,比較-如何在澤西 (1)

ETags為客戶端緩存提供了一種機制,用於驗證緩存內容是否仍然是最新的。 關於你的問題:

  1. 一直到服務器決定 - 它必須在給定的時間點唯一地標識資源的版本(可以是資源的版本號,或資源表示的CRC32哈希值,或者可以用來確定如果資源已經改變)
  2. 澤西目前不提供任何對客戶端緩存的支持。 你可以通過實現ClientFilter來創建自己的緩存,ClientFilter攔截客戶端請求,查看它的內部HashMap(例如),將URI,媒體類型和請求方法映射到緩存響應。 從緩存的響應中提取ETag並將其附加到客戶端請求。 當服務器響應時,篩選器檢查服務器是否響應了304(未修改)狀態碼,如果是,則篩選器將先前緩存的響應返回給客戶端,如果不是,則緩存從服務器返回的響應並將其返回給客戶。
  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和最後修改的支持。

這個維基百科文章提供了ETag的一個很好的概述: http : //en.wikipedia.org/wiki/HTTP_ETag

此刻即時嘗試啟用我的球衣寧靜服務的緩存。

所以出現了一些問題。

  1. 什麼是entityTag的價值? 它可以只是一個獨特的隨機生成的字符串?

  2. 當我從客戶端發送到服務器的請求時,我用實體標籤取迴響應。 問:如何緩存這個,我怎麼知道哪個緩存的實體標籤我必鬚髮送下一個獲取請求?

  3. 在服務器端,我得到sended的標籤。 我如何比較這與資源? 因為我沒有附加entityTag的資源。

  4. 它只是比較entityTags。 那麼我什麼時候需要最後修改的標題值呢?

對不起,很高興能得到一個服務器和客戶端的例子。 我無法找到這個問題的任何東西。 如何在請求中發送entityTags,如何在服務器端比較它們以及上次修改的內容。





jersey