Http EntityTag-值、缓存、比较-如何在Jersey中

Http EntityTag-值、缓存、比较-如何在Jersey中,http,rest,jersey,Http,Rest,Jersey,目前,我正在尝试为我的jersey restful服务启用缓存 因此出现了一些问题 entityTag的值是多少?它可以是唯一生成的随机字符串吗 当我从我的客户机向服务器发出post请求时,我用实体标记返回响应。问题:如何缓存这个,如何知道下一个get请求必须发送哪个缓存的entityTag 在服务器端,我得到sended entityTag。如何将其与ressource进行比较?因为我没有将entityTag附加到ressource 这只是比较entityTags。那么,我什么时候需要最后修改

目前,我正在尝试为我的jersey restful服务启用缓存

因此出现了一些问题

  • entityTag的值是多少?它可以是唯一生成的随机字符串吗

  • 当我从我的客户机向服务器发出post请求时,我用实体标记返回响应。问题:如何缓存这个,如何知道下一个get请求必须发送哪个缓存的entityTag

  • 在服务器端,我得到sended entityTag。如何将其与ressource进行比较?因为我没有将entityTag附加到ressource

  • 这只是比较entityTags。那么,我什么时候需要最后修改的标题值


  • 抱歉,如果能为服务器端和客户端提供一个示例,那就太好了。我找不到关于这个问题的任何东西。如何在请求中发送EntityTag,如何在服务器端比较它们以及上次修改的内容。

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

  • 由服务器决定-它必须在给定时间点唯一标识资源的版本(可以是资源的修订号,或资源表示的CRC32哈希,或可用于确定资源是否已更改的任何其他内容)
  • Jersey目前不支持客户端缓存。您可以通过实现ClientFilter来创建自己的缓存,ClientFilter拦截客户端请求,查看将URI、媒体类型和请求方法映射到缓存响应的内部HashMap(例如)。从缓存的响应中获取ETag并将其附加到客户端请求。当服务器响应时,筛选器检查服务器是否使用304(未修改)状态代码响应,如果是,则筛选器将以前缓存的响应返回给客户端,如果不是,则缓存从服务器返回的响应并将其返回给客户端
  • 通过在请求中发送实体标记,客户机基本上会说:“我有一个与此实体标记对应的实体版本-实体是否仍然相同,或者是否已更改?如果已更改,请将实体的新版本与标记一起发送给我!”。若服务器在初始响应中并没有发送任何实体标记,则客户端不知道与缓存实体对应的标记,所以它无法在其请求中发送标记。服务器知道标记的含义-对于客户端来说,标记值是不透明的
  • 你可以选择其中之一,也可以同时选择两者
  • 在服务器端,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:

    这个例子是否应该没有request.evaluatePreconditions(et)?