Ajax - мне нужно проверять, существует ли действительный сеанс перед каждым AJAX-запросом - PullRequest
1 голос
/ 20 августа 2009

Я работаю над проектом, который использует аутентификацию пользователя. У меня возникла проблема с моими AJAX-запросами, если при выполнении запроса не было аутентифицированного сеанса.

У меня время ожидания сеанса 3 минуты, поэтому, если пользователь неактивен в течение 3 минут, выполните какое-либо действие, которое вызывает запрос AJAX, тогда запрос завершится ошибкой и вернет ошибку 403. Здесь я планирую перехватить все запросы AJAX со страницы и отправить запрос на сервер, который вернет объект JSON, сообщающий, существует ли допустимый сеанс. Если он есть, клиент продолжит выполнение текущего запроса, иначе он перезагрузит текущую страницу, которая приведет пользователя к странице входа в систему, и пользователь снова должен будет предоставить учетные данные.

Вот моя реализация.

$("#param-ajax").ajaxSend(function(evt, request, settings) {
var pingurl = GtsJQuery.getContextPath() + '/ping.json';
var escapedurl = pingurl.replace(/\//g, "\\/");

var regexpr1 = eval('/^' + escapedurl + '\\?.*$/');
var regexpr2 = eval('/^' + escapedurl + '$/');
// Proceed with the ping only if the url is not the ping url else it will
// cause recursive calls which will never end.
if (!regexpr1.test(settings.url) && !regexpr2.test(settings.url)) {
    var timeout = false;
    $.ajax({
                url : pingurl,
                cache : false,
                data : {
                    url : settings.url
                },
                async : false,
                complete : function(request, status) {
                    if (status == "error") {
                        try {
                            // GtsJQuery.getJsonObject() converts the string
                            // response to a JSON object
                            var result = GtsJQuery
                                    .getJsonObject(request.responseText)
                            if (result.timeout) {
                                timeout = true;
                                return;
                            }
                        } catch (e) {
                            // ignore the error. This should never occure.
                        }
                    }
                }
            });
    // Reload the window if there is a timeout -- means there is no valid
    // sesstion
    if (timeout) {
        window.location.reload();
    }
}
});

Здесь все работает нормально, включая window.location.reload (), но исходный запрос ajax не прерывается. Поскольку исходный запрос AJAX не прерывается после запуска перезагрузки страницы, запрос AJAX также отправляется на сервер. Мне нужен какой-то механизм, который позволит мне прервать исходный запрос, если время ожидания окажется истинным.

Этот пост предлагает некоторый ответ, но проблема остается с плагинами сторонних производителей, такими как datatables, которые используют AJAX. Мы не можем написать обработчик ошибок для этих запросов AJAX.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

Если я понимаю ситуацию, вам это не нужно. В исходный запрос ajax просто добавьте функцию ошибки, которая будет перенаправлять пользователя.

errHandler = function(XMLHttpRequest, textStatus, errorThrown) {
      if( textStatus.match(/forbidden/i) ) {
        redirectUserToLoginHere();
      }
}

$.ajax({

    success: yourFunctionHere,

    error: errHandler
})

Тогда вы сможете создать некоторую оболочку ajax, которая всегда имеет этот errHandler, поэтому вам не нужно помещать его в каждый отдельный вызов ajax.

EDIT:

после некоторого эксперимента, если обработчик 'ajaxSend' выдает ошибку, то исходный запрос никогда не будет отправлен.

Кроме того, если обработчик делает

document.location = '/login';

тогда исходный запрос никогда не отправляется.

Надеюсь, это поможет:)

0 голосов
/ 29 августа 2009

Я изменил свою концепцию сейчас, я проверяю xmlHTTPRequest на стороне сервера, используя заголовок запроса 'x-required-with'.

Если это xmlHTTPRequest, то x-required-with будет иметь значение «XMLHttpRequest». Обе библиотеки javascript (EXTjs и jQuery), которые я использую, правильно устанавливают этот заголовок.

Вот мой код на стороне сервера

boolean isAjaxRequest = StringUtils.endsWithIgnoreCase(request.getHeader("x-requested-with"), "XMLHttpRequest")

EDIT

Если данный запрос является ajax-запросом, ответом будут данные json, которые будут иметь статус 403 и будут содержать ключ с именем timeout со значением true например: {timeout: true, ....}

Затем мы обработаем это в обработчике событий $ .ajaxError (), который обработает ошибку. Если состояние ошибки 403 и значение тайм-аута равно true, я перезагружу страницу.

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