Przyczyną problemu jest rotacja cookie sesji, gdy AJAX połączeń jest wykonywana, właściwa poprawka została uwzględniona w CodeIgniter 3
Masz cztery opcje:
Cope: I zmierzyłem się z tym problemem wcześniej, nie znając dokładnie jego przyczyny. W skrócie, zapisałem obietnicę każdego XMLHttpRequest, jeśli napotkano kod statusu 401 HTTP, aplikacja po stronie klienta zażądałaby poświadczeń w postaci wyskakującego okienka, a następnie ponowiła obietnicę AJAX.
po stronie klienta z jQuery, wystarczy dodać ten moduł obsługi 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);
});
}
});
i po zalogowaniu z powrotem, po prostu zadzwoń do tego, aby ponowić swoją prośbę:
$(document).trigger('retry-xhr');
stronie serwera, wystarczy tylko trzeba dodać, jeśli w swoim konstruktorze:
if (!$this->session->userdata('logged_in') && $this->input->is_ajax_request())
{
$this->output->set_status_header('401');
exit;
}
To było przydatne, ponieważ niektórzy użytkownicy mogliby lea ve ich okno aplikacji internetowej otworzyło się na noc, a limit czasu sesji zostałby przekroczony. Następnie użytkownicy mogliby do mnie zadzwonić, że nie są w stanie wykonać żadnej funkcji AJAX, i musiałbym im powiedzieć, aby nacisnąć F5
ps. jeśli na kątowe, Użyłem HTTP Auth Interceptor Moduł powodzeniem
Hack: Zobacz ten post, a jego rozwiązanie jest stworzenie innego pola w tabeli ci_session i sprawdzić zarówno ciasteczek, więc sesja będzie nadal ważny po obrocie.
Wyjaśnia również szczegółowo, co jest przyczyną tej usterki
http://www.hiretheworld.com/blog/tech-blog/codeigniter-session-race-conditions
Upgrade: rozpocząć korzystanie z kolejną wersję, gdzie jest już naprawiono:
https://github.com/EllisLab/CodeIgniter/tree/release/3.0
poprawki Zamień linię 346 w systemie/biblioteki/sesja.php (funkcja sess_update())
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
Z:
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now || $this->CI->input->is_ajax_request())
robisz żadnych ajax żądania w dowolnym miejscu? są problemy z klasą sesji i warunkami wyścigu CIs, które nie zostały jeszcze w pełni rozwiązane. – jmadsen
Używam zapytań ajaxowych - na stronie głównej znajduje się zapytanie ajax, które zasadniczo wykonuje żądanie GET w celu przeszukania tabeli bazy danych. – Zabs