У меня есть фиктивный проект, в котором я тестирую поведение 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
?