Причиной проблемы является ротация файлов cookie сеанса при выполнении вызова AJAX, правильное исправление было включено в CodeIgniter 3.
У вас есть четыре варианта:
Решение: я сам сталкивался с этой проблемой раньше, не зная точно ее причины. Короче говоря, я сохранил обещание каждого XMLHttpRequest, если встречался код состояния HTTP 401, клиентское приложение запрашивало учетные данные в форме всплывающего окна, а затем повторяло обещание AJAX.
Клиентская сторона с jQuery, просто добавьте этот обработчик ajaxError:
$(document).ajaxError(function (e, xhr, settings, exception) {
if (xhr.status == 401)
{
// open your popup
$('#login-popup').modal('open');
// attach the xhr object to the listener
$(document).bind( "retry-xhr", {
xhro: xhr
},
function( event ) {
// retry the xhr when fired
$.ajax( event.data.xhro );
});
}
});
и когда вы снова войдете в систему, просто вызовите это, чтобы повторить свой запрос:
$(document).trigger('retry-xhr');
На стороне сервера вам нужно только добавить if в свой конструктор
if (!$this->session->userdata('logged_in') && $this->input->is_ajax_request())
{
$this->output->set_status_header('401');
exit;
}
Это было полезно, потому что некоторые пользователи оставляли окно своего веб-приложения открытым на ночь, и срабатывал тайм-аут сеанса. Затем пользователи звонили мне и сообщали, что не могут выполнять какие-либо функции AJAX, и мне приходилось говорить им, чтобы они нажали F5.
пс. если на Angular, я успешно использовал модуль HTTP Auth Interceptor
Хак: см. этот пост, его решение состоит в том, чтобы создать еще одно поле в таблице ci_session и проверить наличие обоих файлов cookie, чтобы ваш сеанс оставался действительным после ротации.
Он также подробно объясняет, что вызывает этот сбой
http://www.hiretheworld.com/blog/tech-blog/codeigniter-session-race-conditions
Обновление: начните использовать следующую версию, в которой уже исправлено:
https://github.com/EllisLab/CodeIgniter/tree/release/3.0
Исправить Заменить строку 346 в system/libraries/Session.php (функция sess_update())
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
С:
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now || $this->CI->input->is_ajax_request())
person
Josue Alexander Ibarra
schedule
08.10.2013