Это звучит так, как будто JavaScript запускает асинхронный запрос.В противном случае проблема не имеет никакого смысла.Действие ссылки в любом случае будет выполняться только после возврата функции JavaScript.Но когда вы запускаете асинхронный / аяксический запрос в функции JS, тогда действительно может возникнуть условие гонки.Это не выполняется синхронно.Он выполняется "в фоновом режиме".
Необходимо убедиться, что ссылка вызывается только после завершения асинхронного запроса.Предполагая, что вы делаете это в «обычном ванильном» JS XMLHttpRequest
вместо удобной библиотеки Ajaxical JS, такой как jQuery , тогда вам нужно выполнить эту работу в onreadystatechange
.
Измените ссылку следующим образом:
<a href="/servlets/MyServlet" onclick="return createPageView(this)">
(обратите внимание, что псевдопротокол javascript:
является ненужным и что функции JS обычно начинаются со строчной буквы)
И исправьте свою функцию JS следующим образом (не совместим с MSIE, исправьте это самостоятельно)
function createPageView(link) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
window.location = link.href; // See?
}
}
xhr.open('GET', 'http://example.com', true);
xhr.send(null);
return false; // Block link's default action.
}
Что касается вопроса, почему сеанс уничтожается, он будет "уничтожен", когдаЗаголовки запроса не содержат надлежащий файл cookie сеанса, или когда вы вызываете session.invalidate()
на стороне сервера, или когда запрос был запущен в другом домене / контексте.Вы единственный, кто может выяснить, кто из них виновен.