0

我有一个模拟项目,我在不同的浏览器上进行测试EtagIf-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 上,标头仅包含在所有其他请求中。我知道有几个关于EtagsIf-None-Match和 Safari 的问题,但它们都是关于它的完全缺席。在我的情况下,第一个请求不包含If-None-Match(如预期的那样),第二个请求会,但第三个请求不会。然后它在发送标头和不发送标头之间摇摆不定。我修改了我的代码以返回304是否If-None-Match存在标头,这会提示 Safari 随每个请求发送标头,但它不会更新Etag分配新的值。我知道这是预期的行为,但是当我返回 200 和 new 时,有没有办法让 Safari 表现得像 chrome 和 Firefox Etag

4

0 回答 0