Вызов сервлета после того, как функция JavaScript убивает сессию - PullRequest
0 голосов
/ 30 декабря 2010

У меня было следующее:

<a href="/servlet/MyServlet" onclick="javascript:CreatePageView();"> Link 1 </a>

но я заметил, что функция JavaScript CreatePageView () не выполнялась все время и создавала ситуацию гонки. Иногда выполнялся javascript, в других случаях перенаправление происходило первым.

Итак, я хотел контролировать порядок событий и подумал о том, чтобы вызвать сервлет в моей функции javascript.

function CreatePageView()
{
    //Execute javascript function here

    //Invoke servlet here
    document.forms[0].action = "/servlet/MyServlet";
    document.forms[0].submit();
}

Когда я вызываю свой сервлет, моя сессия разрушается, и я перенаправляюсь на страницу входа. Кто-нибудь может объяснить, почему это происходит? Или, возможно, предложить альтернативный метод вызова сервлета без прерывания сеанса? Заранее спасибо.

1 Ответ

2 голосов
/ 30 декабря 2010

Это звучит так, как будто 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() на стороне сервера, или когда запрос был запущен в другом домене / контексте.Вы единственный, кто может выяснить, кто из них виновен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...