Safari не всегда отправляет If-None-Match для загрузки страницы - PullRequest
1 голос
/ 01 апреля 2019

У меня есть фиктивный проект, в котором я тестирую поведение 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 новым назначенным заголовком. Я понимаю, что это ожидаемое поведение, но есть ли способ заставить Safari вести себя как chrome и Firefox, когда я возвращаю 200 и новый Etag?

...