我有一个模拟项目,我在不同的浏览器上进行测试Etag
和If-None-Match
行为。在Get
页面加载时发送请求,我将始终响应200
并分配一个新Etag
值。
window.addEventListener('load', () => getEtag(false));
function getEtag() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log("Success");
}
};
xhr.onerror = function () {
console.log("Failure");
};
xhr.open("Get", "http://localhost:8080/etag", true);
xhr.send();
}
Java服务器端:
@GetMapping("/etag")
public String getEtag(HttpServletRequest request, HttpServletResponse response) {
response.setHeader("ETag", UUID.randomUUID());
return "";
}
我明白这不是我的预期用途,Etags
但请容忍我。在 Chrome 和 Firefox 上,这可以按预期工作。在每个页面加载时,请求都包含If-None-Match
标题。但是,在 Safari 上,标头仅包含在所有其他请求中。我知道有几个关于Etags
和If-None-Match
和 Safari 的问题,但它们都是关于它的完全缺席。在我的情况下,第一个请求不包含If-None-Match
(如预期的那样),第二个请求会,但第三个请求不会。然后它在发送标头和不发送标头之间摇摆不定。我修改了我的代码以返回304
是否If-None-Match
存在标头,这会提示 Safari 随每个请求发送标头,但它不会更新Etag
分配新的值。我知道这是预期的行为,但是当我返回 200 和 new 时,有没有办法让 Safari 表现得像 chrome 和 Firefox Etag
?