Spring MVC响应标题:ETag有GET请求的双引号但不是PUT请求

时间:2017-11-08 20:10:10

标签: spring spring-mvc get put etag

我们的服务中将Spring MVC从4.0升级到4.3。它导致了#34; GET"的响应头中的ETag格式变化。方法。客户制作" GET"调用将在响应头中获得带双引号的ETag。以前,响应头中的ETag没有双引号,因为" GET"方法。

例如:

handleSelectChange = (val) => {
  const value = val.map(item => item.value);
    this.setState({
      value
  });
}

" PUT"的响应请求在标题中的ETag周围没有双引号,就像之前一样。

任何人都有任何想法?

1 个答案:

答案 0 :(得分:1)

在Spring 4.2.x之前,没有ETag标头的管理。自那时起,它已在HttpEntityMethodProcessor引入。该类已经在时间内发展,并且ETag标题的管理遵循RFC(或足够接近)。

正如您在此commit中所看到的,Spring团队修复了其管理层的问题:

  

修复了回复中缺少的ETag / LastModified标头

     

在此提交之前,HttpEntityMethodProcessor会避免   在调用之前编写ETag / Last-Modified响应头   ServletWebRequest处理条件请求。这样做是为了   避免由于标头已经存在重复的响应标头值   写入底层servlet响应。

     

对于GET / HEAD请求,这仍然是必需的,因为这是正确的   由ServletWebRequest处理这些案件。但   HttpEntityMethodProcessor不应该做出这个决定   PUT / PATCH / POST响应,因为开发人员正在添加响应头   目的,应该控制情况 - 而   <{1}}在这些情况下不会写出这些标题。

修改后的代码的相关部分是here

所以基本上,当你手动添加 ETag标题时,如果 200 状态为 GET HEAD 方法,框架将其删除,然后重新创建。这就是为什么使用 PUT 时,没有双引号。

在HttpEntityMethodProcessor中:

ServletWebRequest

然后在ServletWebRequest中:

    if (inputMessage.getMethod() == HttpMethod.GET || inputMessage.getMethod() == HttpMethod.HEAD) {
        responseHeaders.remove(HttpHeaders.ETAG);
        responseHeaders.remove(HttpHeaders.LAST_MODIFIED);
    }

如您所见,这尊重chapter 2.4 of the RFC

  

2.4。何时使用实体标签和最后修改日期

     

在对GET或HEAD的200(OK)响应中,原始服务器:

     

o应该发送实体标签验证器,除非它不可行         生成一个。

     

o如果发送弱实体标签而不是强实体标签         性能考虑支持使用弱实体标签,或         如果发送强大的实体标签是不可行的。

     

o如果可以发送Last-Modified值,应该发送Last-Modified值。

     

换句话说,源服务器的首选行为是      成功发送强实体标签和最后修改值      对检索请求的响应。

但是我发现它不是向后兼容的,并且破坏了开发人员在这些版本之前可以使用的内容,而没有跳过/覆盖他们所做的事情的可能性。

以下是ETag from the MDN的说明(更清晰)。

希望它有助于理解。