Я работаю над проектом, который использует аутентификацию пользователя. У меня возникла проблема с моими 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.
Спасибо.