La causa del problema è una rotazione cookie di sessione quando viene effettuata una chiamata AJAX, la correzione adeguata è stata inclusa in CodeIgniter 3
Sono disponibili quattro opzioni:
Cope: I affrontato questo problema prima senza sapere esattamente la causa di ciò. In breve, ho salvato la promessa di ogni XMLHttpRequest, se il codice di stato HTTP 401 fosse stato riscontrato, l'applicazione client avrebbe richiesto le credenziali sotto forma di popup e poi avrebbe ripreso la promessa di AJAX.
lato client con jQuery, basta aggiungere questo gestore 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);
});
}
});
e quando si è connessi indietro nel, basta chiamare questo per ripetere la richiesta: lato
$(document).trigger('retry-xhr');
Server, è solo è necessario aggiungere un if nel tuo costruttore
if (!$this->session->userdata('logged_in') && $this->input->is_ajax_request())
{
$this->output->set_status_header('401');
exit;
}
Questo è stato utile perché alcuni utenti avrebbero lasciato La finestra della loro app Web è aperta durante la notte e il timeout della sessione si avvia. Quindi gli utenti mi chiamerebbero per non poter eseguire alcuna funzione AJAX e dovrei dire loro di premere F5
ps. se da angolare, ho usato l'Auth Interceptor modulo HTTP con successo
Hack: vedere questo post, la sua soluzione è quella di creare un altro campo nella tabella ci_session e verificare la presenza di entrambi i cookie, quindi la sessione sarà ancora valida dopo la rotazione.
Si spiega anche nel dettaglio che cosa sta causando questo glitch
http://www.hiretheworld.com/blog/tech-blog/codeigniter-session-race-conditions
Aggiornamento: Iniziare a utilizzare la versione successiva dove è già fissato:
https://github.com/EllisLab/CodeIgniter/tree/release/3.0
Patch Sostituire la linea 346 nel sistema/librerie/Session.php (funzione sess_update())
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
Con:
if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now || $this->CI->input->is_ajax_request())
si stanno facendo le richieste Ajax da qualche parte? ci sono problemi con la classe di sessione di CI e le condizioni di gara che non sono state ancora completamente risolte – jmadsen
Sto usando richieste di jax - sulla homepage c'è una richiesta di jax che fondamentalmente fa una richiesta GET per cercare una tabella di database. – Zabs