我们的服务中将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周围没有双引号,就像之前一样。
任何人都有任何想法?
答案 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的说明(更清晰)。
希望它有助于理解。