实体标签 - 值,缓存,比较 - 如何在泽西岛



目前我正在尝试为我的球衣 Restful 服务启用缓存。

所以出现了一些问题。

  1. 实体标签的价值是什么?它可以只是一个唯一生成的随机字符串吗?

  2. 当我从客户端向服务器发出发布请求时,我会得到带有实体标记的响应。问题:如何缓存它,我如何知道我必须为下一个 get 请求发送哪个缓存的实体标签?

  3. 在服务器端,我得到了发送的实体标签。我如何将其与资源进行比较?因为我没有将实体标签附加到资源。

  4. 它只是关于比较实体标签。那么我什么时候需要上次修改的标头值呢?

抱歉,很高兴获得服务器和客户端的示例。我找不到这个问题的任何内容。如何在请求中发送实体标签,如何在服务器端比较它们以及上次修改的内容。

> ETag 为客户端缓存提供了一种机制,用于验证缓存的内容是否仍然是最新的。关于您的问题:

  1. 由服务器决定 - 它必须唯一标识给定时间点的资源版本(可以是资源的修订号,或资源表示的CRC32哈希,或任何其他可用于确定资源是否已更改的内容)
  2. 泽西岛目前不提供对客户端缓存的任何支持。您可以通过实现 ClientFilter 来创建自己的缓存,该筛选器拦截客户端请求,查看其内部 HashMap(例如),该 HashMap 将 URI、媒体类型和请求方法映射到缓存的响应。从该缓存的响应中获取 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 和上次修改的标头提供了相同类型的支持。

这篇维基百科文章很好地概述了ETags:http://en.wikipedia.org/wiki/HTTP_ETag

最新更新